回文数
题目描述
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,121 是回文,而 123 不是。
示例
1 | 输入:121 → 输出:true |
方法 1:字符串切片
实现步骤
要判断一个整数是否是回文数,可以通过以下步骤实现:
- 负数处理 :如果输入的整数 x 是负数,则它不可能是回文数,因为负号会让正序和倒序不同。
- 反转数字比较 :将整数反转后与原整数进行比较。如果两者相等,则说明它是回文数。
Python 实现
1 | class Solution(object): |
逐行代码解析
1. 负数处理
1 | if x < 0: |
如果输入的整数 x
是负数,直接返回 False
。
2. 整数转字符串
1 | str_x = str(x) |
为什么要转换为字符串?
- 字符串支持切片操作(如
[::-1]
),可以方便地获取字符串的反转结果。 - 直接操作整数无法实现类似的反转操作。
3. 判断回文数
1 | return str_x == str_x[::-1] |
判断字符串 str_x
是否等于它的反转字符串 str_x[::-1]
。
如果相等,则返回 True
,表示 x
是回文数;否则返回 False
。
1 | str_x[::-1]是 Python 的切片操作,用于反转字符串。 |
方法 2:不使用字符串(仅用数学运算)
思路
我们不能用 str(x)
把整数转成字符串。因此,需要用数学方式构造 “整数的倒序表示”,并且仅构造一半就能进行对比:
- 如果数是回文,则前半部分和后半部分是一样的,我们可以转计后半部数字,和剩下的 x 进行比较即可。
实现步骤
- 如果 x < 0,是负数,不可能是回文
- 如果 x 最后一位是 0,但 x 不是 0,也不是回文
- 通过每次抽出 x 的最后一位,加到 reversed_half 的尾部,并把 x 去掉最后一位
- 当 reversed_half 大于或等于 x 时,表示已处理到中间,开始比较
示意图:1221 如何处理
1 | x = 1221 |
如果不是回文:示例 x = 1234
1 | x = 1234 |
Python 实现
1 | class Solution(object): |
逐行代码解析
1. 提前处理 明显不是回文数 的情况
1 | if x < 0 or (x % 10 == 0 and x != 0): |
- 负数和以 0 结尾的非 0 整数不能是回文
2. 创建一个变量用来保存 从后往前取出来的一半数字(反转的一半)
1 | reversed_half = 0 |
3. 控制什么时候“反转了一半”
1 | while x > reversed_half: |
举例:
1 | x = 1221 |
4. 反转核心逻辑
我们要把整数 x 的最后一位一位“提取出来”,然后像搭积木一样把这些数字反转组合起来。
比如,我们有一个数 x = 1234,我们想把它从后往前反转得到:4321
1 | reversed_half = reversed_half * 10 + x % 10 |
举例:
初始状态
1 | x = 1234 |
第一步循环
1 | reversed_half = 0 * 10 + 1234 % 10 = 0 + 4 = 4 |
第二步循环
1 | reversed_half = 4 * 10 + 123 % 10 = 40 + 3 = 43 |
第三步循环
1 | reversed_half = 43 * 10 + 12 % 10 = 430 + 2 = 432 |
第四步循环
1 | reversed_half = 432 * 10 + 1 % 10 = 4320 + 1 = 4321 |
x % 10
: 作用是取出数字的最后一位,例如 123 % 10 = 3
x //= 10
: 整除 10,相当于x = x // 10
- 作用是把数字“去掉最后一位,例如
123 // 10 = 12
reversed_half * 10
: 作用是把上一轮的最后一位往前推进一格
5. 判断是不是回文
1 | return x == reversed_half or x == reversed_half // 10 |
如果是偶数位数字,例如 1221:
- 比较
x == reversed_half
,就是 12 == 12
如果是奇数位数字,例如 12321:
- 反转时
reversed_half
会多出一个中间数(比如 123) - 需要去掉中间数再比较:
reversed_half // 10
就是去掉最后一位(3 → 去掉 3)