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();关键点总结
- 负数处理:负数不可能是回文数
- 零结尾:除了0本身,以0结尾的数字不可能是回文数
- 优化技巧:只反转后半部分,避免完全反转
- 奇偶位数:需要分别处理奇数位和偶数位的情况
- 边界情况:0和个位数都是回文数
总结
这道题考察了以下重点:
- 回文判断:理解回文数的定义和判断方法
- 数学运算:如何通过数学运算反转数字
- 优化思维:只反转一半数字的巧妙思路
- 边界处理:对特殊情况的考虑
数学方法是最优解,时间复杂度为 O(log n),空间复杂度为 O(1)。在实际面试中,建议先提出字符串解法,然后优化到数学解法,展示对性能的考虑。