Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
Example 1:
Input: 121 Output: true
Example 2:
Input: -121 Output: false Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:
Input: 10 Output: false Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
Follow up:
Coud you solve it without converting the integer to a string?
easy题,思路很简单,有三种方法:
1.大多数同学一般都能想到转换成字符串,然后用头尾指针判断两字符是否相同,直至两指针相遇。
2.用队列保存每个余数,再将队列里的数字取出整合成一个数,判断是否与源数字相同
注意:要用队列而不是栈的原因是,取出顺序决定了最后整合出的数字是否与源数字顺序相反。
代码如下:
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0)
return false;
int temp = x;
queue<int> que;
while (temp > 0)
{
que.push(temp % 10);
temp = temp / 10;
}
while (!que.empty())
{
temp = temp * 10 + que.front();
que.pop();
}
if (temp == x)
return true;
return false;
}
};
3.但是用队列还是显得效率太过低下,还有没有更快捷的方式?有,思路借鉴了暴力解最长回文子串,详情请移步点击打开链接
例如12121这样的奇数位数字,我们只需判断高两位12是否与低三位121 % 10的结果相同即可。
再如121121这样的偶数位数字,我们只需判断前半部分的几位数字是否与后半部分数字相同即可。
代码如下:
class Solution {
public:
bool isPalindrome(int x) {
if (x == 0)
return true;
if (x < 0 || x % 10 == 0)
return false;
int half_reverse_x = 0;
while (x > half_reverse_x){
half_reverse_x = half_reverse_x * 10 + x % 10;
x /= 10;
}
return x == half_reverse_x || x == half_reverse_x / 10;
}
};