题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
本人不才,自己想的思路不快,还是看了一下官方的题解,确实妙。
数学解法
回文首先不能是负数,因此可以一上来就判断输入是不是负数。其次,是10的整数倍也不是回文,所以可以一并判断。需要注意的是0也是回文。
C代码:
bool isPalindrome(int x){
if(x < 0 || (x != 0 && x % 10 == 0))
{
return false;
}
int rN = 0;
while (x > rN)
{
rN = rN * 10 + x % 10;
x /= 10;
}
return x == rN || x == rN / 10;
}
求后半段数字的时候顺便把原来的x慢慢变小,直到x<=rN,如果x的位数是奇数个,那中间那个数就无所谓,就在最后返回的时候用rN/10即可。
字符串解法
由于对python字符串处理比较熟悉,一开始就想到了字符串解法。先将输入x转换成字符串,然后循环判断对称位置上的字符是否一样。
初级python代码:
class Solution:
def isPalindrome(self, x: int) -> bool:
buf = str(x)
size = len(buf)
for i in range(size // 2):
if buf[i] != buf[size - i - 1]:
return False
return True
字符串解法的话,可以跳过检查负数的操作,因为负数可以直接在循环里检测到,第一次循环就会return False。这样的运行效果是80ms,击败了82.19%的人,那还能不能更快?
字符串切片是个好东西啊,真香,直接利用切片操作把转换后的字符串反转,再比较这两个字符串是否相等不就完事儿,只需3行代码。
class Solution:
def isPalindrome(self, x: int) -> bool:
temp = str(x)
buf = temp[::-1]
return temp == buf
领扣的OJ我感觉有毒,我这提交上去运行竟然不进反退,运行100ms,前面有一样的代码运行40ms,我佛了。