算法:获取1-10000之间所有的对称数(回文数)

这篇具有很好参考价值的文章主要介绍了算法:获取1-10000之间所有的对称数(回文数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

获取1-n 之间所有的对称数(回文数),例如:

1-9
11 22 33 ..
101 111 121 131 ...
....

思路一

遍历,记两个变量 n1、n2。

  • n1 是遍历的数字转为字符串
  • n2 是把每个数字转换为字符串,再转换为数组,再进行反转,再转为字符串。

比较 n1 和 n2 相等的话则是回文。

/**
 * 查询 1-max 的所有对称数(数组反转)
 * @param max 最大值
 */
export function findPalindromeNumbers1(max: number): number[] {
    const res: number[] = []
    if (max <= 0) return res

    for (let i = 1; i <= max; i++) {
        // 转换为字符串,转换为数组,再反转,比较
        const s = i.toString()
        if (s === s.split('').reverse().join('')) {
            res.push(i)
        }
    }

    return res
}

思路二

和思路一差不多,思路一是转化为数组比较,思路二将字符串进行头尾比较

/**
 * 查询 1-max 的所有对称数(字符串前后比较)
 * @param max 最大值
 */
export function findPalindromeNumbers2(max: number): number[] {
    const res: number[] = []
    if (max <= 0) return res

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

        // 字符串头尾比较
        let flag = true
        let startIndex = 0 // 字符串开始
        let endIndex = length - 1 // 字符串结束
        while (startIndex < endIndex) {
            if (s[startIndex] !== s[endIndex]) {
                flag = false
                break
            } else {
                // 继续比较
                startIndex++
                endIndex--
            }
        }

        if (flag) res.push(i)
    }

    return res
}

思路三

生成翻转数文章来源地址https://www.toymoban.com/news/detail-425484.html

/**
 * 查询 1-max 的所有对称数(翻转数字)
 * @param max 最大值
 */
export function findPalindromeNumbers3(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
}

测试

// 功能测试
console.info(findPalindromeNumbers3(200))

// 性能测试
console.time('findPalindromeNumbers1')
findPalindromeNumbers1(100 * 10000)
console.timeEnd('findPalindromeNumbers1') // 408ms

console.time('findPalindromeNumbers2')
findPalindromeNumbers2(100 * 10000)
console.timeEnd('findPalindromeNumbers2') // 53ms

console.time('findPalindromeNumbers3')
findPalindromeNumbers3(100 * 10000)
console.timeEnd('findPalindromeNumbers3') // 42ms

  • 数组的转换需要时间
  • 操作数字更快,电脑原型就是计算器

到了这里,关于算法:获取1-10000之间所有的对称数(回文数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树OJ题目合集(单值、对称、平衡、构建加遍历)

    目录 前言: 一:单值二叉树 二:二叉树遍历 核心点 (1)前序 (2)中序 (3)后序 三:判断两颗树是否相同 四:判断二叉树是否对称 五:判断一颗树是否为另一颗树的子树 六:平衡二叉树 七:二叉树的构建加遍历 这一部分适合已经 适用于已经掌握二叉树基础的同学(遍历,求节

    2024年02月02日
    浏览(37)
  • 【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    题目链接:5. 最长回文子串 题目内容: 题目就是要我们找s中的回文子串,还要是最长的。其实想想,暴力求解也行……就是遍历所有的子串,同时判断是不是回文串,是的话再和记录的最大长度maxlen比较,如果更长就更新。时间复杂度直接变成O(n^3)。 优化的点在于,假设子

    2024年02月09日
    浏览(48)
  • mysql统计所有分类下的数量,没有的也要展示

    要求统计所有分类下的数量,如果分类下没有对应的数据也要展示。这种问题在日常的开发中很常见,每次写每次忘,所以在此记录下。 这种统计往往不能直接group by,因为有些类别可能没有对应的数据 这里有两个思路(如果您有更好的方法,请一定要告诉我,求求了):

    2024年03月28日
    浏览(52)
  • 题目:1893.检查是否区域内所有整数都被覆盖

    ​​ 题目来源:         leetcode题目,网址:1893. 检查是否区域内所有整数都被覆盖 - 力扣(LeetCode) 解题思路:        start 和 end 的取值范围是 1- 50,因此可以使用比特位位数为 64 的 Long 来表示,第 i 位为 1表示 i 在范围内,否则不在。          获得范围后,通过逻辑

    2024年02月12日
    浏览(38)
  • 线性代数:为什么所有3x3对称矩阵构成的向量空间是6维的?(mit第11讲中的疑问)

    对应mit线性代数第11讲矩阵空间,秩1矩阵,小世界图第6-7分钟的讲解问题:3x3对称矩阵构成的向量空间为什么是6维的 看了一些资料,发现这个国外的大哥讲得清楚 https://math.stackexchange.com/questions/2813446/what-is-the-dimension-of-the-vector-space-consisting-of-all-3-by-3-symmetric-mat 转成中文后如

    2024年02月03日
    浏览(52)
  • 每日一博 - 对称加密算法 vs 非对称加密算法

    在信息安全领域中,加密算法是保护数据安全的重要手段。 加密算法可以分为多种类型,以下是其中的一些: 对称加密算法:使用相同的密钥进行加密和解密,如DES、AES等。 非对称加密算法:使用公钥和私钥进行加密和解密,如RSA、ECC等。 哈希函数:将任意长度的消息压缩

    2024年02月07日
    浏览(42)
  • Qt所有容器之间的区别,以及如何简单使用?

    Qt中常用的容器有 QList、QVector、QMap、QHash、QSet 等,它们都具有不同的特性和适用场景。 1. QList:动态数组,可以动态增加和删除元素,支持随机访问和迭代,适用于不需要频繁插入或删除元素的场景。 ```cpp QListint list; list.append(1); list.append(2); foreach(int val, list) {     qDebug()

    2024年01月19日
    浏览(36)
  • 【基础算法】[PTA]-找出不是两个数组共有的元素

    找出不是两个数组共有的元素 题目描述: 解题思路: 【整体思路】:在两个整型数组中,找出不是两者共有的元素,意思就是既要在第一个数组中找出第二个数组中没有出现的元素,也要在第二个数组中找出第一个数组中没有出现的元素。所以这里可以每个数组做一次主体

    2024年02月04日
    浏览(44)
  • 【水文】计算并输出1到100之间所有质数的和

    #include stdio.h #include stdbool.h // 函数声明 bool isPrime(int num); int main() {     int sum = 0;     printf(\\\"1到100之间的质数有:n\\\");     for (int i = 2; i = 100; ++i) {         if (isPrime(i)) {             printf(\\\"%d \\\", i);             sum += i;         }     }     printf(\\\"n质数的和为:%dn\\\", sum);    

    2024年02月20日
    浏览(40)
  • C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

    一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。 需要两个密钥

    2024年02月09日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包