Determine whether an integer is a palindrome. Do this without extra space.
检测当前数字是否是回文数字,同时不能增加额外的内存空间,这里一个注意的点就是 负数 都不可能是回文数字
然后是检测出来每一位数字进行比较
代码还是写得比较繁琐,主要的一个点就是数字的位数是基数位和偶数位的时候处理的过程是不同的
class Solution {
public:
int GetH(int x,int num)//获得对应位置的数字
{
while(num)
{
x = x/10;
num--;
}
return x%10;
}
bool isPalindrome(int x) {
if(x < 0)
{
return false;
}
int Hnum = 0;
int y = x;
while(y)
{
Hnum++; //记录数字一共有多少位
y = y/10;
}
if(Hnum&1)//<奇数位数
{
int num = Hnum/2;//<d
int i = 1;
while(i <= num)
{
int h = GetH(x,num-i);
int l = GetH(x,num+i);
if(h!= l)
{
return false;
}
i++;
}
}
else
{
int num = Hnum/2;
int i = 0;
while(i < num)
{
int h = GetH(x,num+i);
int l = GetH(x,num-1-i);
if(h!= l)
{
return false;
}
i++;
}
}
return true;
}
};
这里用到一个base直接计算出来最高位的级别,100 、1000,100000......在做的时候直接利用除法
而且这里比较的时候是从两边向中间进行比较,那么这个时候数位的奇偶位置就不再显得重要,也就不需要写分支
所以: 如果是数位之间的比较,最好是利用头尾之间进行比较。
class Solution {
public:
bool isPalindrome(int x) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (x < 0)
return false;
if (x == 0)
return true;
int base = 1;
while(x / base >= 10)
base *= 10;
while(x)
{
int leftDigit = x / base;
int rightDigit = x % 10;
if (leftDigit != rightDigit)
return false;
x -= base * leftDigit;
base /= 100;
x /= 10;
}
return true;
}
};