题目:回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
1 | 输入: 121 |
示例 2:
1 | 输入: -121 |
示例 3:
1 | 输入: 10 |
进阶:
你能不将整数转为字符串来解决这个问题吗?
思路
该提如果使用字符串解决,那是相当方便的,可直接通过字符串的切片[::-1]
获得反转的字符串进行比较即可,也无需判断正负号的问题:
1 | class Solution: |
既然进阶中要求不用字符串,那么如何获取反转数字呢?其实也很简单,对原数字进行%10
取余,对反转数字不停的*10
加上余数,即可。大体思路如下:
- 先判断特殊情况,负数,最后一位为0的非0数肯定不是回文数,直接返回
- 获取反转数字:
- 初始化反转数字reversedNum=0
x%10
获取个位数字- revservedNum进位再加上x的个位数字
x=x/10
- 比较反转数字与原数字即可
实现:
1 | class Solution: |
优化方法
在上述计算反转数字中,其实没有必要获取全部反转数字reversedNum,只需要计算到一半,然后比较反转数字与剩余的x即可。
如果x个位数为偶数,那么reversedNum==x
如果为奇数,那么reversedNum//10 == x
比如x = 12321,根据上述逻辑,计算到reversedNum=123时,x=12,满足奇数条件
比如x = 1221,根据上述逻辑,计算到reversedNum=12是,x=12,满足偶数条件
那么怎么判断已经计算到一半了呢:
由于反转过程中是对reversedNum的进位,和x的退位,当计算到一半时,reversedNum必然大于x。
实现如下:
1 | class Solution: |
如果大家有更好的方法,欢迎一起探讨。