在做这道题目的时候,一开始我的想法是如果输入的整数x为负数,则直接返回false,如果为非负数,则将x翻转,翻转后的数为after,如果after==x,则返回true,否则返回false。我这个算法的缺点和优点都很明显,优点是实现简单,逻辑便于理解。缺点是对于一些case,花费的时间可能会比较大,比如对于122222224,尽管我们可以很快就判断这个数不是回环数(因为起始数字为1,末尾数字为4),但是用我一开始的算法,依然要将122222224翻转之后,才能给出答案。我的代码为:
bool isPalindrome(int x) {
if (x < 0) {
return false;
}
int before=x, after=0;
do {
after = after*10 + before%10;
before /= 10;
} while (before);
return after==x;
}
更好的一种算法思想是直接从左边和右边剥离x的最高位left和最低位right,如果left!=right,则直接返回false,否则将x转化为去掉最高位和最低位数字之后的数,并继续剥离最高位和最低位,进行比较。代码如下:
bool isPalindrome(int x) {
if (x < 0) {
return false;
}
int div=1, left, right;
while (x/div >= 10) { // div的数值为x的最高位所对应的10的次方,比如x=10,则div=10。如果x=889,则div=100。
div *= 10;
}
while (x != 0) {
left = x/div;
right = x%10;
if (left != right) {
return false;
}
x = x%div/10;
div /= 100; // 因为对x剥离了最高位与最低位,所以在这里要除以100。
}
return true;
}