【前端算法】获取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,不好识别复杂度
  • 数字操作最快,其次是字符串
相关文章
|
3月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
138 1
|
13天前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
15 0
|
2月前
|
算法 前端开发 机器人
一文了解分而治之和动态规则算法在前端中的应用
该文章详细介绍了分而治之策略和动态规划算法在前端开发中的应用,并通过具体的例子和LeetCode题目解析来说明这两种算法的特点及使用场景。
一文了解分而治之和动态规则算法在前端中的应用
|
3月前
|
搜索推荐 前端开发 算法
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
203 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
|
2月前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
3月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
65 1
|
3月前
|
数据采集 前端开发 算法
基于朴素贝叶斯算法的新闻类型预测,django框架开发,前端bootstrap,有爬虫有数据库
本文介绍了一个基于Django框架和朴素贝叶斯算法开发的新闻类型预测系统,该系统具备用户登录注册、后台管理、数据展示、新闻分类分布分析、新闻数量排名和新闻标题预测等功能,旨在提高新闻处理效率和个性化推荐服务。
|
5月前
|
前端开发 算法 JavaScript
优化算法在前端性能提升中的应用
随着互联网应用的日益复杂,前端性能优化成为开发者关注的焦点。本文探讨了优化算法在前端性能提升中的重要作用,包括对JavaScript代码的优化、资源加载的算法选择以及页面渲染的优化策略。通过合理应用优化算法,可以有效提升前端应用的性能和用户体验。
|
4月前
|
缓存 算法 前端开发
前端 JS 经典:LRU 缓存算法
前端 JS 经典:LRU 缓存算法
85 0
|
7天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。