回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
当然负数不是(-123 --> 321-)
HighLeve:取数x的左右两端的数,如果相等把这两个数去掉,继续取两端数判断。
这里先说一下取一个数的左边几位和右边几位怎么操作(具体说应该是留下):
eg:取102的左端和右端
取左端:除(x / d)取左边i位,d就应该是10^(位数-i)。(102 / 100)-- "1";
取右边:模(x % d)取右边i位,d就应该是10*i。 (102 %10) -- "2";
如果要去掉左边(右边)i位,其实就是留下右边(左边)(位数-i)位
总结一下: 除(/)操作,会留下左边的
模(%)操作,会留下右边的
eg:x /10 --> 留下x十位左边的数(包括十位)
x % 10 --> 留下x十位右边的数(不包括十位)
public boolean isPalindrome(int x) {
// corner case
if (x < 0) {
return false;
}
// 取x左右的数
int d = 1; // 在找左边一位之前要先确定x除几能得到个位数
while (x / 10 >=10) {
d = d*10;
}
while (x > 0) {
int left = x / d;
int right = x % 10;
if (left != right) {
return false;
}
// 如果相等,去掉x两端,继续进行同样判断
x = (x % d) /10; // x % d -- 留下d位右边,/ 10 -- 留下10位左边
// 这波操作完后把首位和个位去掉
d = d / 100; // 去掉了两位数,下一轮循环的d也要降两个数量级
}
return true;
}