恩
注意观察输入是int X
说明有范围
并且有正负
特殊情况特判并且防溢出即可
负数,xxx0不会是回文数。
0是回文数
思路
先想itoa转char*然后头尾对比。但是时间空间开销有。
然后想直接int mod取首位但是首部不好取。
那就直接从尾部开始,取x的后一半翻转,对比前半部分。
辣么怎么判断到了一半奥
一般情况可以搞一个table判断先判断x的位数:
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
// Requires positive x
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
}
这里简单的处理
while(rest>tail)即可,因为到达中间时位数多一位
这样奇数位时只需考虑tail后几位
偶数位时,tail会比rest多两位(假如不是回文数)
class Solution {
public:
bool isPalindrome(int x) {
int tail=0;
if(x==0)
return true;
if(x<0||(x%10==0))
return false;
while(x > tail) {
tail = tail * 10 + x % 10;
x /= 10;
}
//if()
return x == tail || x == tail/10;
}
};