- admin 的博客
回文数判断算法笔记
- @ 2025-11-3 9:46:26
基本概念
回文数是指正读和反读都相同的数字,例如121、1331、12321等。非回文数包括123、-121、10等。
算法方法对比
方法一:字符串反转法
bool isPalindrome(int n) {
string str = to_string(n);
string reversed = str;
reverse(reversed.begin(), reversed.end());
return str == reversed;
}
特点:简单直观,但需要额外字符串空间,效率相对较低。
方法二:完整数字反转法
bool isPalindrome(int n) {
if (n < 0) return false;
long long reversed = 0;
int original = n;
while (n > 0) {
reversed = reversed * 10 + n % 10;
n /= 10;
}
return original == reversed;
}
特点:纯数学运算,不需要字符串,但可能整数溢出。
方法三:双指针法
bool isPalindrome(int n) {
string str = to_string(n);
int left = 0, right = str.length() - 1;
while (left < right) {
if (str[left++] != str[right--])
return false;
}
return true;
}
特点:只需比较到中间即可,但仍需字符串转换。
方法四:反转一半数字法(推荐)
bool isPalindrome(int n) {
if (n < 0 || (n % 10 == 0 && n != 0))
return false;
int reversed = 0;
while (n > reversed) {
reversed = reversed * 10 + n % 10;
n /= 10;
}
return n == reversed || n == reversed / 10;
}
算法原理分析(方法四)
反转一半数字法是最优解决方案,原因如下:
- 时间复杂度为O(log₁₀n)
- 空间复杂度为O(1)
- 不会发生整数溢出问题
- 无需额外数据结构
- 执行效率最高
算法处理流程:
- 边界条件检查:负数直接返回false,末尾为0的非零数返回false
- 数字反转过程:只反转数字的一半
- 奇偶位数处理:
- 偶数位:直接比较 n == reversed
- 奇数位:比较 n == reversed / 10(去掉中间位)
示例说明:
- 输入1221:n=12, reversed=12 → true
- 输入12321:n=12, reversed=123 → n == reversed/12 → true
性能比较
方法四在时间和空间复杂度上都是最优的,特别适合处理大规模数据。
使用建议
- 日常使用和编程竞赛推荐使用方法四
- 教学演示可以使用方法一,因为它最直观
- 面试时需要掌握方法四并能解释其原理
注意事项
- 所有方法都应先检查负数情况
- 注意边界情况:0是回文数,个位数都是回文数
- 以0结尾的数字(除0外)都不是回文数
总结
反转一半数字法是最优解决方案,它避免了整数溢出问题,空间复杂度为常数级,时间复杂度最优,适用于各种规模的输入。掌握这种方法的原理和实现对于算法学习具有重要意义。