可以看出,负数肯定不是回文数
难的地方是这个要求。
先循环一次,看这个数字有多少位。
每次将右移位后的首位和取余之后的最后一位比较。
计算一下循环
int x = 12345;
int count = 0;
while(x>0){
x/=10;
count++;
}
System.out.println(count);
验证一下,看来移位是不行的。
移位是将二进制的111000000这些移位,不是简单的抹去右边的几位数字
System.out.println(12345>>2);
还是用除以10吧。
一个没考虑到的地方
比如100001
第二次比较是10000
虽然除的东西变少了,但是最高位还是1,并且会一直都是1.
所以应该改成,除了n-i-1次10之后,再对10取余。
这样就能保证当前这个整数一定是正确的了。因为有原来的最高位+自己,哪怕自己是0也没关系
但是10和0,对10取余都是0,会错。
如1001
末尾是1 对应的是10
第二轮迭代 末尾是0 对应的还是10
这样改
维护这样一个数,这个数是从最高位开始增长的。
比如1001。那么就是1,10
每次取最后一个数和原数字的最后一位比较即可。
真是灵光一闪啊!
public static boolean isPalindrome(int x) {
//负数肯定不是
if(x<0)
return false;
//个位数肯定是
if(x>=0&&x<=9)
return true;
int num = x;
int count = 0;
while(num>0){
num/=10;
count++;
}
int des = 1;
//计算获取最高位,需要除多少
for(int i=1;i<count;i++){
des*=10;
}
//只需比较到中间就好了
int middle = count/2;
//因为是0开始的,<即可
//num是维护从最高位开始的数字的,所以num不变
num=x;
for(int i=0;i<middle;i++){
//计算首位
int high = (num/des)%10;
//计算末尾
int low = x%10;
if(high!=low)
return false;
x/=10;
//需要除10的次数减少了
des/=10;
}
return true;
}
排最前面的都是通过反转字符串的方法的。
只能说维护两个数组,真的利器。