9. 回文数
9. 回文数
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
示例 1:
输入:x = 121 输出:true
示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
进阶:你能不将整数转为字符串来解决这个问题吗?
def is_k_palindrome(x: int, k: int) -> bool:# 在以 k 为基数的表示中,如果 x 能被 k 整除,那么其 k 进制表示的最后一位是 0。而回文数字通常不允许以 0 开头(除非是 0 本身),因此这是一个快速排除的条件。if x % k == 0:return False# 用来构建 x 在 k 进制下的反向数字rev = 0# x // k 是 x 除以 k 的整数部分,相当于去掉 x 在 k 进制下的最后一位# 当 rev 构建的反向数字还没有达到或超过 x 去掉最后一位的数字时,继续循环。while rev < x // k:# x % k 是 x 在 k 进制下的最后一位数字。# rev * k 将 rev 左移一位(在 k 进制下),然后加上 x 的最后一位。# 这相当于将 x 的数字从低位到高位依次取出,构建其反向的数字。rev = rev * k + x % k# 相当于将 x 右移一位(在 k 进制下)x //= k# 这样,每次循环中:# 取出 x 的最后一位(x % k),加到 rev 的后面。# 去掉 x 的最后一位(x = x // k)。return rev == x or rev == x // k
# 如果 x 在 k 进制下是回文,那么在构建 rev 的过程中,rev 会逐步等于 x 的前半部分。对于偶数长度的回文,rev 会等于 x 的前半部分;对于奇数长度的回文,rev 会等于 x 去掉中间数字后的前半部分。# 例如:# 偶数长度:x 的 k 进制表示为 abba,rev 构建为 ab,x 逐步变为 ab,最后 rev == x。
# 奇数长度:x 的 k 进制表示为 abcba,rev 构建为 ab,x 逐步变为 a,最后 rev == x * k + b(可能需要 rev == x // k 来匹配)。