判断回文数的两种高效方法(附Python实现)
在算法面试中,"判断回文数"是经典题目,常要求不转字符串实现。本文将详解两种解决方案:数学反转法(空间O(1))和字符串转换法(极简实现)
目录
问题定义
方法一:数学反转法(空间O(1))
关键步骤解析:
复杂度分析:
方法二:字符串转换法(极简实现)
两种方法对比
使用建议
问题定义
回文数指正序和倒序读相同的整数,例如:
-
121 → 是回文数
-
123 → 非回文数
-
-121 → 非回文数(负数均非回文)
-
10 → 非回文数(末尾0导致反转后不等)
方法一:数学反转法(空间O(1))
核心思想:反转数字的一半,与剩余部分比较
def isPalindrome(x: int) -> bool:# 负数和末尾为0的非零数直接排除if x < 0 or (x % 10 == 0 and x != 0):return Falsereverted = 0# 反转直到后半部分≥前半部分while x > reverted:reverted = reverted * 10 + x % 10 # 取末位加入反转数x //= 10 # 移除已处理末位# 分奇偶情况判断return x == reverted or x == reverted // 10
关键步骤解析:
-
边界处理:
-
负数直接排除(
x < 0
) -
末位为0的非零数排除(如10→反转后为01→实际值1≠10)
-
-
反转循环:
-
每次取
x
末位:x % 10
-
更新反转数:
reverted = reverted*10 + x%10
-
移除
x
末位:x //= 10
-
-
结果判断:
-
偶数位:
x == reverted
(如1221→12==12) -
奇数位:
x == reverted//10
(如12321→12==123//10)
-
复杂度分析:
-
时间复杂度:O(log n)(循环次数为位数一半)
-
空间复杂度:O(1)(仅用常数空间)
方法二:字符串转换法(极简实现)
核心思想:利用字符串反转特性直接比较
def isPalindrome_str(x: int) -> bool:if x < 0:return Falses = str(x)return s == s[::-1] # 字符串与反转比较
关键步骤解析:
-
边界处理:排除所有负数
-
类型转换:
str(x)
将数字转为字符串 -
反转比较:
s[::-1]
生成反转字符串,与原串比较
复杂度分析:
-
⏰ 时间复杂度:O(n)(字符串反转操作)
-
💾 空间复杂度:O(n)(存储字符串)
两种方法对比
特性 | 数学反转法 | 字符串转换法 |
---|---|---|
核心操作 | 数学运算(%, //) | 字符串切片 |
空间复杂度 | O(1) | O(n) |
可读性 | 中等(需处理奇偶) | 极佳(一目了然) |
适用场景 | 内存敏感环境 | 快速实现/可读优先 |
使用建议
-
面试场景:
-
优先询问是否允许转字符串
-
若要求空间O(1),使用数学反转法
-
若无限制,字符串法更稳妥
-
-
实际工程:
-
推荐字符串法:代码简洁不易出错
-
性能敏感场景用数学法(如处理超大整数)
-
面试点睛:当被要求"不转字符串"时,数学法需注意两个关键边界:①负数 ②末位0的非零数。掌握这两点即可完美解题!