当前位置:首页 > 技术 > 正文内容

查找1到10000之间的回文数

访客 技术 2026年6月18日 1

**问题:在1至10000之间找出所有回文数(对称数)。**

以下是三种不同的实现方法及其性能分析:

方法一:字符串反转法

将数字转换为字符串,然后通过反转字符串来判断是否为回文数。

  • 将数字转换为字符串。
  • 反转字符串并与其原始值进行比较。

这种方法虽然简单易懂,但由于涉及字符串的多次操作,性能较差。

方法二:字符头尾对比法

将数字转换为字符串后,逐一比较字符串首尾字符是否相同。

  • 将数字转换为字符串。
  • 从两端开始逐个字符进行比较,直到中间位置。

此方法避免了完整的字符串反转,因此性能优于方法一。

方法三:数学反转法

利用数学运算生成一个数字的反转形式,并与原数字进行比较。

  • 使用取模和整除操作逐步构建反转后的数字。
  • 最后比较原数字与反转后的数字是否相等。

这种方法仅涉及数值运算,性能最佳。

性能分析

  • 方法一:由于需要多次字符串操作,时间复杂度较高。
  • 方法二:虽然也是线性复杂度,但比方法一更高效。
  • 方法三:纯数值运算,性能最优。

代码实现

方法一


/**
 * 查找 1 到 max 范围内的所有回文数 - 字符串反转法
 * @param max 
 * @returns 回文数数组
 */
function getSymmetricNumbers1(max: number): number[] {
    const results: number[] = [];
    if (max < 1) return results;
    for (let num = 1; num <= max; num++) {
        const str = num.toString();
        const reversedStr = Array.from(str).reverse().join('');
        if (str === reversedStr) {
            results.push(num);
        }
    }
    return results;
}

方法二


/**
 * 查找 1 到 max 范围内的所有回文数 - 头尾字符对比法
 * @param max 
 * @returns 回文数数组
 */
function getSymmetricNumbers2(max: number): number[] {
    const results: number[] = [];
    if (max < 1) return results;
    for (let num = 1; num <= max; num++) {
        const str = num.toString();
        let isSymmetric = true;
        for (let i = 0, j = str.length - 1; i < j; i++, j--) {
            if (str[i] !== str[j]) {
                isSymmetric = false;
                break;
            }
        }
        if (isSymmetric) {
            results.push(num);
        }
    }
    return results;
}

方法三


/**
 * 查找 1 到 max 范围内的所有回文数 - 数学反转法
 * @param max 
 * @returns 回文数数组
 */
function getSymmetricNumbers3(max: number): number[] {
    const results: number[] = [];
    if (max < 1) return results;
    for (let num = 1; num <= max; num++) {
        let original = num;
        let reversed = 0;
        while (original > 0) {
            reversed = reversed * 10 + original % 10;
            original = Math.floor(original / 10);
        }
        if (num === reversed) {
            results.push(num);
        }
    }
    return results;
}

测试用例


/**
 * 测试回文数函数
 */
import { getSymmetricNumbers1, getSymmetricNumbers2, getSymmetricNumbers3 } from './palindrome-number';

describe('回文数测试', () => {
    it('正常范围测试', () => {
        expect(getSymmetricNumbers1(100)).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]);
        expect(getSymmetricNumbers2(100)).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]);
        expect(getSymmetricNumbers3(100)).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]);
    });
    it('负数范围测试', () => {
        expect(getSymmetricNumbers1(-100)).toEqual([]);
        expect(getSymmetricNumbers2(-100)).toEqual([]);
        expect(getSymmetricNumbers3(-100)).toEqual([]);
    });
});
标签: TypeScript

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。