1:反转比较法
复杂度:时间 O(n) 空间 O(1)
思路:
回文数有一个特征,就是它反转后值是一样的,所以我们可以先将其反转,然后比较反转数和原数是否相等,该方法的问题在于溢出的判断和处理。
代码
public boolean isPalindrome(int x) {
// 负数不是回访数字
if (x < 0) {
return false;
}
// 数字逆转后的值,为了不使用溢出采用long
long reverse = 0;
int tmp = x;
// 求逆转后的值
while (tmp != 0) {
reverse = reverse * 10 + tmp % 10;
tmp /= 10;
}
// 判断是否是回文数字
return x == reverse;
}
2:逐位比较法
复杂度:时间 O(n) 空间 O(1)
思路:
反转比较有可能会溢出,但我们遍历每一位的时候其实并不用保存上一位的信息,只要和当前对应位相等就行了,所以我们可以遍历一遍先算出数的长度,再遍历一遍同时对比前后的对应位
代码
public boolean isPalindrome(int x) {
if(x < 0){
return false;
}
int digits = 1;
int original = x;
// 计算当前数的位数,个位数不用计算,已经默认为1
while(x > 9){
digits *= 10;
x /= 10;
}
// 逐位比较
x = original;
while(x > 0){
int msd = x / digits;
int lsd = x % 10;
if(msd != lsd){
return false;
}
// 去除最高位和最低位
x -= msd * digits;
x /= 10;
digits /= 100;
}
return true;
}
三:
public boolean isPalindrome(int x) {
if (x<0 || (x!=0 && x%10==0)) return false;
int rev = 0;
while (x>rev){
rev = rev*10 + x%10;
x = x/10;
}
return (x==rev || x==rev/10);
}
思路:这是直接用数字来做的一个做法,只要数字为末尾为0的,也就是说除以10的余数为0,就一定不是回文,因为最高位不可能为0.
然后就创建了一个整型变量来记录x从右往左读到一半时的数,而原来的x则一步步转化成从左往右读一半的数,最后看看两个数是不是相等,而因为中间有单独一个数,所以还有可能是除以10后才相等。