1. 题目来源
链接:lc9. 回文数
2. 题目解析
方法一:字符串
转换成字符串,倒序字符串判断相等就完事了。爽!
代码:
// 爽!
class Solution {
public:
bool isPalindrome(int x) {
string s = to_string(x);
return s == string(s.rbegin(), s.rend());
}
};
// 数学判断溢出+溢出特判
// 当且仅当整数的逆序和它本身相等,其为回文数
// 但是直接拿来逆序却会溢出,11 11 11 11 19
// 逆序为 91 11 11 11 11,就导致了整数溢出
// 其实仅需算出一半的逆序数,再判断是否和前一半相等即可
// 该方法需要考虑多个边界情况,比较麻烦,时间复杂度为O(1)
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0 || x && x % 10 == 0) return false;
int s = 0;
while (s <= x) {
s = s * 10 + x % 10;
if (s == x || s == x / 10) return true;
x /= 10;
}
return false;
}
};
方法二:整数逆置
负数不用考虑,正数就简单的整数逆置即可。开 long long
就能简化下代码了。至于非要用 int
存的话怕是做不了,需要改做法。
代码:
// 爽!
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
long long res = 0;
int t = x;
while (x) { res = res * 10 + x % 10; x /= 10; }
return res == t;
}
};
方法三:判断一半
当且仅当整数的逆序和它本身相等,其为回文数。但是直接拿来逆序却会溢出,11 11 11 11 19,逆序为 91 11 11 11 11,就导致了整数溢出。其实仅需算出一半的逆序数,再判断是否和前一半相等即可。但该方法需要考虑奇偶长度这个边界情况,比较麻烦,时间复杂度为 O ( 1 ) O(1) O(1)。
注意:
- 整数不会存在前导 0,但是逆序后可能会存在前导 0。显然是不成立的,一开始需要特判掉。即需要去除自身非零但末尾是零的元素。
- 整数位数为奇偶两种情况时,针对一半的处理也是不一样的,这个也是注意点。
代码:
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0 || x && x % 10 == 0) return false;
int res = 0;
while (res <= x) {
res = res * 10 + x % 10;
if (res == x || res == x / 10) return true; // 分别处理整数长度是奇数或者偶数的情况
x /= 10;
}
return false;
}
};