题目描述#
哎呀,这题挺亲切的——给你一个整数 x,要是它正着读和倒着读一模一样,就返回 true,否则返回 false。比如 121 正反都是 121,是回文;123 倒过来成了 321,就不是啦。
思路#
咱第一眼看,最直白的办法就是:把这个数整个倒过来,再跟原数比一比,相等就是回文。本姑娘这版走的就是这条路——纯数学反转,连转字符串都省了。
先把负数和边界拎出来:负数因为带个负号,倒过来肯定对不上(比如 -121 反过来不是它自己),所以 x <= 0 时直接判断——只有 x == 0 才算回文(0 正反都是 0),其余负数一律 false。
正数部分就是经典的"逐位取数、累加重建":拿个 cur 当反转结果,每一轮用 num % 10 抠出 num 的最低位,塞进 cur 的末尾(cur = cur*10 + num%10,相当于 cur 先整体进一位、再把新数字补在个位),然后 num /= 10 把已经处理过的最低位丢掉。循环到 num 变成 0,cur 就是 x 完整翻转后的样子。最后比一句 x == cur 就有答案了。
这里咱特意用了 num 这个副本去做反转,把原始的 x 原封不动留着做最后比较——要是直接拿 x 边反转边改,原值就丢了,可没法对照啦。时间复杂度是 $O(\log_{10} x)$(位数那么多轮),空间 $O(1)$,简洁又稳当~
知识边界#
- 整数反转(不借字符串):
cur = cur*10 + num%10配合num /= 10,是"取最低位 + 累加进位"的经典组合,反转数字、分离各位都靠它。 - 保留原值用副本:反转时用
num := x操作副本,原始x留着最后比较,别把要对照的值改没了——这点容易踩坑哦。 - 负数与 0 的边界:负数带符号,反转必然不等,直接判
false;x == 0是回文要单独放行。 - 整数溢出(本题可不忧):完整反转理论上可能溢出,但本题
x在 int 范围内、Go 的 int 够宽,所以这版没特判;若题目卡 32 位整型,可改成"只反转一半"来规避,作了解。
代码#
下面这版咱一行没动,数学反转后直接比较:
func isPalindrome(x int) bool {
if x <= 0 {
return x == 0
}
cur := 0
num := x
for num > 0 {
cur = cur*10 + num%10
num /= 10
}
return x == cur
}好啦,数学专区咱就用这道回文数开张~去整理今天的照片咯,下次再来收拾更刁钻的数论题!