题面
LeetCode 9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,121 是回文,而 123 不是。
方法一. 字符串
利用C++的to_string函数把 x x x转换成字符串,把 s t r i str_i stri和 s t r n − i − 1 str_{n - i - 1} strn−i−1对比,如果不相等返回 f a l s e false false,如果退出循环,返回 t r u e true true
方法一. 代码
class Solution {
public:
bool isPalindrome(int x) {
string str = to_string(x);
int n = str.size();
for (int i = 0; i < n / 2; i++) {
if (str[i] != str[n - i - 1]) {
return false;
}
}
return true;
}
};
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
方法二. 反转一半数字
将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。
但是上述方法有一个问题,反转之后的数字可能导致整数溢出。
例如数字
1000000009
1000000009
1000000009,反转之后是
9000000001
9000000001
9000000001,大于INT_MAX, 所以我们需要想一个办法来避免整数溢出的问题。
我们可以将数字反转一半,如果原数字回文,那么反转一半后的数字应等于前半部分的数字。
注意:
负数不可能是回文数,因为负号只有一个!!!
方法二.代码
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0 || (x != 0 && x % 10 == 0)) {
return false;
}
int y = 0;
while (x > y) {
y = y * 10 + x % 10;
x /= 10;
}
return x == y || x == y / 10;
}
};
复杂度分析
- 时间复杂度: O ( l o g n ) O(logn) O(logn)
- 空间复杂度: O ( 1 ) O(1) O(1)