给定一个数字,例如:1234554321,怎么才能判断这个数是不是回文呢?要求时间复杂度是O(n),空间复杂度是O(1).约定负数和0都不是回文。
如果要求不是空间复杂度是O(1),那可以直接把数字转换成字符串,用sprintf函数,然后判断这个字符串是不是回文。
第一种思路就是把这个数字,比如123321进行反转,然后把反转后的结果和原来的数字进行比较,如果相等那么就说明是这个数字是回文形式,相反则不是,基本思路代码如下:
int reverse(int num) {
assert(num >= 0); // for non-negative integers only.
int rev = 0;
while (num != 0) {
rev = rev * 10 + num % 10;
num /= 10;
}
return rev;
}
如果对int的表示范围比较敏感的话,就会提出一个问题,一个数字进行反转之后会不会溢出呢,假设一个数是int能表示的最大数字,然后把这个数字的最后一个进制换成9,那么反转之后就会溢出。溢出了也说明这个数字不是回文。那么怎么来解决这个问题呢?一种思想就是设定两个指针,一个指向数字的开头,一次指向数字的结尾,分别取出两个指针指向的数字,进行比较,如果不相等,比较结束,数字不是回文,如果相等,那么把两个指针分别前移和后移,继续比较下两个数字是否相等。在看代码之前考虑一下怎么做才能分别取出前后两个对应的数字呢?
bool isPalindrome(int x) {
if (x < 0) return false;
int div = 1;
while (x / div >= 10) {
div *= 10;
}
while (x != 0) {
int l = x / div;
int r = x % 10;
if (l != r) return false;
x = (x % div) / 10;
div /= 100;
}
return true;
}