0-10000 之间所有对称数
例如 11, 121 ,1,2
思路1
转为字符串,转为数组, 反转, 转为字符串 然后比较
代码实现
function findPalindrome(max) {
var res = [];
if (max < 1)
return res;
for (var i = 1; i <= max; i++) {
var n = i.toString();
// 转为字符串, 转为数组, 反转, 转为字符串, 比较
if (n.split('').reverse().join('') === n) {
res.push(i);
}
}
return res;
}
思路2
字符串首尾比较
代码实现
function findPalindrome2(max:number):number[] {
const res :number[] =[]
if (max<1) return res
for(let i=1;i<=max;i++) {
let n = i.toString();
// 字符串首尾比较
let flag = true
let startIndex = 0
let endIndex = n.length-1
while(startIndex<endIndex) {
if (n[startIndex] != n[endIndex]) {
flag = false
break
}else {
startIndex++
endIndex--
}
}
if (flag) res.push(i)
}
return res
}
思路3
翻转数字
代码实现
function findPalindrome3(max) {
var res = [];
if (max < 1)
return res;
for (var i = 1; i <= max; i++) {
var n = i;
var rev = 0;
while (n > 0) {
rev = rev * 10 + n % 10;
n = Math.floor(n / 10);
}
if (rev === i)
res.push(i);
}
return res;
}
三种方式的时间测试
console.time('findPalindrome')
findPalindrome(100*10000)
console.timeEnd('findPalindrome') //436ms
console.time('findPalindrome2')
findPalindrome2(100*10000)
console.timeEnd('findPalindrome2') // 50ms
console.time('findPalindrome3')
findPalindrome3(100*10000)
console.timeEnd('findPalindrome3') // 43ms
总结
- 方式1 中 一个循环中,用了字符串和数组的转换,时间比较慢
- 在方式2 和方式3 中 发下操作数字比字符串快
- 尽量不要用转换数据结构
- 尽量不用内置api