【前端算法】获取1-10000之间的所有回文数

简介: 获取1-10000之间的所有回文数的几种思路以及比较

对称数

  • 求1-10000之间的所有对称数(回文数)
  • 例如:0,1,2,11,22,101,232...

思路1—使用数组反转、比较

  • 数字转换为字符串,在转换为数组
  • 数组reverse,再join为字符串
  • 前后字符串进行对比

代码实现

function getPalindrome1(max:number):number[] {
  const res:number[] = []
  if(max <= 0) return res

  for (let i = 1; i < max; i++) {
    const n = i.toString()
    if (n === n.split('').reverse().join('')) {
      // 数值转字符串,在分割、反转、拼接后和原数比较,一样说明是回文数
      res.push(i)
    }
  }
  return res
}

功能测试

getPalindrome1(100)

结果

[
   1,  2,  3,  4,  5,  6,  7,
   8,  9, 11, 22, 33, 44, 55,
  66, 77, 88, 99
]

思路2—字符串头尾比较

  • 数字转字符串
  • 字符串头尾字符比较
  • (也可以用栈,像括号匹配,但要注意奇数和偶数)

代码实现

function getPalindrome2(max:number):number[] {
  const res:number[] = []
  if(max <= 0) return res

  for (let i = 1; i <= max; i++) {
    const n = i.toString()
    const len = n.length

    let flag = true // 判断是否是回文数标识
    let startIndex = 0 // 字符串头部
    let endIndex = len -1 // 字符串尾部

    while(startIndex < endIndex) {
      if (n[startIndex] !== n[endIndex] ) {
        flag = false
        break
      } else {
        // 两边向中间推进,继续比较
        startIndex++ 
        endIndex--
      }
    }

    if (flag) {
      res.push(i)
    }
  }
  return res
}

功能测试

getPalindrome2(100)

结果

[
   1,  2,  3,  4,  5,  6,  7,
   8,  9, 11, 22, 33, 44, 55,
  66, 77, 88, 99
]

思路3—生成翻转数

  • 使用% 和Math.floor 生成翻转数
  • 前后数字进行比较
  • (全程操作数字,没有字符串类型)

代码实现

function getPalindrome3(max:number):number[] {
  const res:number[] = []
  if(max <= 0) return res

  for (let i = 1; i <= max; i++) {
    let n = i
    let rev = 0 // 保存生成的翻转数

    // 生成翻转数
    while(n > 0) {
      rev = rev * 10 + n % 10
      n = Math.floor(n / 10)
    }

    if (i === rev) res.push(i)
  }
  return res
}

功能测试

getPalindrome3(100)

结果

[
   1,  2,  3,  4,  5,  6,  7,
   8,  9, 11, 22, 33, 44, 55,
  66, 77, 88, 99
]

单元测试

describe('回文数',() => {
  it('正常情况', () => {
    const res = getPalindrome1(200)
    expect(res.length).toBe(28)
  })

  it('max 小于或者等于 0', () => {
    const res = getPalindrome1(0)
    expect(res).toEqual([])
  })
})

性能测试

console.time('getPalindrome1')
getPalindrome1(100 * 10000)
console.timeEnd('getPalindrome1')

console.time('getPalindrome2')
getPalindrome2(100 * 10000)
console.timeEnd('getPalindrome2')

console.time('getPalindrome3')
getPalindrome3(100 * 10000)
console.timeEnd('getPalindrome3')

打印结果

getPalindrome1: 295.913ms
getPalindrome2: 35.2ms
getPalindrome3: 28.102ms

性能分析

  • 思路1-看似是O(n),但是数组转换、操作都需要时间,很慢
  • 思路2 VS 思路3,操作数字更快(电脑原型就是计算器)
  • 思路2要用栈,不合适,因为栈也一般用数组实现,会慢

总结

  • 尽量不要转换数据结构,尤其数组这种有序结构
  • 尽量不要用内置API,如reverse,不好识别复杂度
  • 数字操作最快,其次是字符串
相关文章
|
8天前
|
移动开发 算法 前端开发
前端算法之堆排序
前端算法之堆排序
13 1
|
8天前
|
算法 前端开发
前端算法之快速排序
前端算法之快速排序
13 0
|
8天前
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
12 0
|
8天前
|
算法 前端开发
前端算法之基数排序
前端算法之基数排序
10 1
|
8天前
|
算法 前端开发 搜索推荐
前端算法之桶排序
前端算法之桶排序
6 1
|
8天前
|
存储 算法 前端开发
前端算法之计数排序
前端算法之计数排序
11 1
|
8天前
|
算法 前端开发 搜索推荐
前端算法之希尔排序
前端算法之希尔排序
4 0
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
1天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
1天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
7 1