LeetCode 9. Palindrome Number

问题链接

LeetCode 9. Palindrome Number

题目解析

判断一个数字是否是回文数字。

解题思路

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


posted @ 2018-03-11 11:42  AlvinZH  阅读(277)  评论(0编辑  收藏  举报