题目描述#

哎呀,这题挺亲切的——给你一个整数 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 变成 0cur 就是 x 完整翻转后的样子。最后比一句 x == cur 就有答案了。

这里咱特意用了 num 这个副本去做反转,把原始的 x 原封不动留着做最后比较——要是直接拿 x 边反转边改,原值就丢了,可没法对照啦。时间复杂度是 $O(\log_{10} x)$(位数那么多轮),空间 $O(1)$,简洁又稳当~

知识边界#

  • 整数反转(不借字符串)cur = cur*10 + num%10 配合 num /= 10,是"取最低位 + 累加进位"的经典组合,反转数字、分离各位都靠它。
  • 保留原值用副本:反转时用 num := x 操作副本,原始 x 留着最后比较,别把要对照的值改没了——这点容易踩坑哦。
  • 负数与 0 的边界:负数带符号,反转必然不等,直接判 falsex == 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
}

好啦,数学专区咱就用这道回文数开张~去整理今天的照片咯,下次再来收拾更刁钻的数论题!

本站总访问量  ·  访客数
你的IP 获取中…