问题链接
题目解析
判断一个数字是否是回文数字。
解题思路
题目已经给出很多提示和注意事项,还要求不能使用额外空间,其实就是想说请直接在数字上操作,不能转换成字符串。另外题目说明直接反转数字会超出范围,其实用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;//两种情况 }};
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.