题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
C++
将整数转换成字符串,再创建一个新的string将其复制,对新string使用algorithm库中的reverse方法进行翻转,对比翻转前后的字符串是否相等。
注意此处应先判断输入的整数是负数的情况。
0~9均是回文数,回文数从10开始判断。
执行用时:12ms
内存消耗:8.1MB
class Solution {
public:
bool isPalindrome(int x) {
string res1 = to_string(x); //先转换成字符串再复制
string res2 = res1;
if(x < 0 || (x != 0 && x % 10 == 0)){
return false;
}else{
reverse(res2.begin(), res2.end());
}
if(res1 == res2){
return true;
}else{
return false;
}
}
};
Python
将整数转换成字符串的做法:
执行用时:80ms
内存消耗:14.1MB
class Solution:
def isPalindrome(self, x: int) -> bool:
strx1 = str(x)
n = len(strx1)
strx2 = ''
for i in range(n):
strx2 = strx1[i] + strx2
if strx2 == strx1:
return True
else:
return False
直接遍历:
执行用时:64ms
内存消耗:14.1MB
class Solution:
def isPalindrome(self, x: int) -> bool:
return str(x) == str(x)[::-1]
不将整数转换成字符串:
执行用时:68ms
内存消耗:13.9MB
class Solution:
def isPalindrome(self, x: int) -> bool:
revnum = 0
if x<0 or (x!=0 and x%10==0):
return False
while x > revnum:
revnum = revnum*10 + x%10
x = x // 10
return revnum//10 == x or revnum == x
C
此处采用对整数所有数字进行翻转然后比较,也可以对一半进行翻转。
对所有数字翻转时,需要注意翻转后的数超出 int 范围溢出的情况。
翻转时,直接对末尾取余,然后通过乘十将其移到前一位。
对所有数字进行翻转:
执行用时:20ms
内存消耗:8MB
bool isPalindrome(int x){
long res = 0, num = x;
if(x < 0 || (x != 0 && x % 10 == 0)){
return false;
}else{
while(num != 0){
res = res*10 + num%10;
num /= 10;
}
}
return x==res;
}
对后一半数字进行翻转:
执行用时:16ms
内存消耗:7.1MB
bool isPalindrome(int x){
int revnum;
if(x<0 || (x!=0 && x%10==0))
return false;
while(x > revnum){
revnum = revnum*10 + x%10;
x = x/10;
}
if(x == revnum || x == revnum/10)
return true;
else{
return false;
}
}