React Router

003-回文数 (Palindrome Number)

LeetCode 第9题 - 回文数的详细题解

题目描述

给你一个整数 x,如果 x 是一个回文整数,返回 true;否则,返回 false

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例

输入:x = 121
输出:true

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

解题思路

通过数学运算反转数字的后半部分,然后与前半部分比较。只反转一半数字可以避免整数溢出问题,同时提高效率。

JavaScript 解决方案

/**
 * @param {number} x
 * @return {boolean}
 */
const isPalindrome = (x) => {
    // 负数不可能是回文数
    if (x < 0) return false;
    
    // 如果数字以0结尾,只有0本身是回文数
    if (x !== 0 && x % 10 === 0) return false;
    
    let reversed = 0;
    let original = x;
    
    // 只反转后半部分
    while (original > reversed) {
        reversed = reversed * 10 + original % 10;
        original = Math.floor(original / 10);
    }
    
    // 对于偶数位数:original === reversed
    // 对于奇数位数:original === Math.floor(reversed / 10)
    return original === reversed || original === Math.floor(reversed / 10);
};

复杂度分析

  • 时间复杂度:O(log n),其中 n 是整数 x 的位数
  • 空间复杂度:O(1),只使用了常数额外空间

测试用例

// 测试函数
const testIsPalindrome = () => {
    const testCases = [
        { x: 121, expected: true },
        { x: -121, expected: false },
        { x: 10, expected: false },
        { x: 0, expected: true },
        { x: 12321, expected: true },
        { x: 12345, expected: false },
        { x: 1001, expected: true },
        { x: 1000, expected: false },
        { x: 1, expected: true },
        { x: 11, expected: true },
        { x: 1234321, expected: true },
        { x: 1234567, expected: false }
    ];

    testCases.forEach((testCase, index) => {
        const result = isPalindrome(testCase.x);
        const passed = result === testCase.expected;
        console.log(`测试用例 ${index + 1}: ${passed ? '通过' : '失败'}`);
        console.log(`输入: x = ${testCase.x}`);
        console.log(`期望: ${testCase.expected}, 实际: ${result}\n`);
    });
};

// 运行测试
testIsPalindrome();

关键点总结

  1. 负数处理:负数不可能是回文数
  2. 零结尾:除了0本身,以0结尾的数字不可能是回文数
  3. 优化技巧:只反转后半部分,避免完全反转
  4. 奇偶位数:需要分别处理奇数位和偶数位的情况
  5. 边界情况:0和个位数都是回文数

总结

这道题考察了以下重点:

  • 回文判断:理解回文数的定义和判断方法
  • 数学运算:如何通过数学运算反转数字
  • 优化思维:只反转一半数字的巧妙思路
  • 边界处理:对特殊情况的考虑

数学方法是最优解,时间复杂度为 O(log n),空间复杂度为 O(1)。在实际面试中,建议先提出字符串解法,然后优化到数学解法,展示对性能的考虑。