问题链接
题目解析
判断一个数字是否是回文数字。
解题思路
题目已经给出很多提示和注意事项,还要求不能使用额外空间,其实就是想说请直接在数字上操作,不能转换成字符串。另外题目说明直接反转数字会超出范围,其实用long long表示反转结果完全没问题,但是我们要理解出题人的意思——不可以反转!
可以一位一位进行比较,通过取整和取余可以获得对应位置的两个数字,进行比较即可。
参考代码
class Solution {
public:
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;
}
};
官方解法
官方链接:一半反转
为了避免反转之后超出范围,采用反转一半数字的方法,也可以比较得出结果。官方是C#代码,这里改写成C++,二者一模一样哈哈哈。
什么时候确定已经达到一半了呢?比较x小于revertedNumber的时候就是了。还需要注意一个问题,数字如果是奇数位的话,得到的revertedNumber将会是x的10倍。然后又发现这样过不了样例数字“10”,那就在最初判断数字时剔除这种情况即可。
Complexity Analysis
Time complexity : (O(log_{10}n)). We divided the input by 10 for every iteration, so the time complexity is (O(log_{10} n))
Space complexity : (O(1)).
参考代码
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0 || (x%10 == 0 && x != 0))//注意判断条件
return false;
int revertedNumber = 0;
while(x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber/10;//两种情况
}
};
LeetCode All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.