16. 0-10000 之间所有对称数

110 阅读1分钟

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. 方式1 中 一个循环中,用了字符串和数组的转换,时间比较慢
  2. 在方式2 和方式3 中 发下操作数字比字符串快
  3. 尽量不要用转换数据结构
  4. 尽量不用内置api