1. 回文数问题解析
回文数判断是算法面试中的经典问题,看似简单却暗藏玄机。我第一次遇到这个问题时,下意识想到的是把数字转成字符串然后比较,但面试官要求用纯数学方法解决,这才意识到其中奥妙。今天我们就来深入剖析LeetCode第9题"回文数"的数学解法。
回文数是指正读反读都相同的数字,比如121、1331等。负数因为带有符号不可能构成回文,而像10这样以0结尾的非零数反转后会变成01,也不符合要求。这些边界情况往往就是面试中的考察重点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路详解
2.1 数学方法的核心思想
数学解法的精髓在于通过数字运算来反转数字的一部分,而不是简单地将整个数字反转。这样做有两个主要优势:
- 避免了处理整数溢出的风险(当反转一个很大的数字时可能会超出整数范围)
- 只需要反转一半的数字就能得出结论,效率更高
具体来说,我们不断将原始数字的最后一位取出,加到反转数字的末尾。当原始数字小于或等于反转数字时,说明我们已经处理了一半或更多的数字。
2.2 边界条件处理
在开始反转前,我们需要先处理几种特殊情况:
- 所有负数都不是回文数(如-121反转后是121-)
- 以0结尾的非零数(如10、100等)反转后首位为0,不符合回文定义
- 数字0本身是回文数
这些边界条件的处理应该放在算法的最开始,可以立即返回明确结果,避免不必要的计算。
3. 代码实现与解析
3.1 Python实现详解
python复制class Solution:
def isPalindrome(self, x: int) -> bool:
# 处理边界情况
if x < 0 or (x % 10 == 0 and x != 0):
return False
reversed_half = 0
while x > reversed_half:
reversed_half = reversed_half * 10 + x % 10
x //= 10
# 处理数字长度为奇数的情况
return x == reversed
