https://leetcode-cn.com/problems/palindrome-number/
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121 输出: true
示例 2:
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。
一般解法:将数字各位转化为数组,首位依次比较。
bool isPalindrome(int x) {
int length=0;
int test1 = x;
int *ar;
if(x==0) return true; //排除特殊情况
else if(x<0 || x%10==0) return false; //尾数为零意味着首位一定为0,因此任何能被10整除
while(test1!=0){ //的数除0外一定不是回文数
test1/=10;
length++; //求数字位数
}
ar = (int*)malloc(sizeof(int)*length); //建立数组
for(int i =0;i<length;i++){ //将各位转化为数组元素
ar[i] = x%10;
x/=10;
}
for(int i = 0,j = length-1;i < length/2;i++,j--){
if(ar[i]!=ar[j]){ //依次比较,若有不同,则非回文数。
free(ar);
return false;
}
}
free(ar);
return true;
}
//时间复杂度O(lg n) 空间复杂度O(lg n)
其他方法:反转法
参照官方题解,若是将所有数字翻转,有可能会产生溢出.
所以将数字翻转一半。即将后半段数字翻转与前半段数字比较,看是否相同。
bool isPalindrome(int x) {
int halfreserve = 0;
if(x==0) return true;
else if(x<0 || x%10==0) return false; // 排除特殊情况
while(x > halfreserve){
halfreserve=halfreserve*10 + (x%10); //减小x规模的同时,处理另一半
x/=10;
}
return x==halfreserve || x==(halfreserve/10); //奇数末尾多一位
}
//时间复杂度O(lg n) 空间复杂度O(1)