LeetCode刷题 9 回文数

题目

判断一个整数是否是回文数。回文数是指正序(从左到右)和倒叙(从右到左)读都是一样的整数。

示例1:

输入: 121

输出: true

示例2:

输入: -121

输出: false

解释: 从左向右读,为-121。从右向左读,为121-。所以它不是一个回文数。

示例3:

输入: 10

输出: false

解释: 从右向左读,为01.因此他不是一个回文数。

思考

最直接的想法当然就是按照回文数的定义,把一个数转换成字符串然后正序倒序各一串,对比两个字符串是否一样。所以用Python的话非常简单。在评论里有一个一条语句就能完成的,如下:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x) == str(x)[::-1]

执行用时: 84ms,在所有Python3提交中击败 88.59%的用户。内存消耗: 14.1MB,在所有Python3提交中击败5.01%的用户

题目里面有个小的追加条件就是不使用字符串。官方给出的解法是反转一半,非常不错的想法,果然还是网上厉害的人很多,很多奇思妙想。

官解思路如下

将数字本身反转,然后将反转后的数字与原始数字进行比较,如果他们相同,那么这个数字就是回文数。但是,如果反转后的数字大雨了int.MAX,将遇到整数溢出问题。

按照这个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转int数字的一半?因为如果是回文数的话,后半部分反转后应该与原来数字的前半部分相同

解题思路

按照官解的想法大致可以分为以下几步:

首先,数字不能是负数,负数的话直接返回false,数字如果在0到9之间,因为只有1位,所以直接返回true。

其次,数字开始反转,大概就是先%10,在/10,可以得到最后一位数,并且移除最后一位数。如此循环。

最后,比较当原始数字比反转后的数字小的时候,就可以循环结束,然后判断。

最后判断循环结束的方法确实很好,只需要比较大小就能结束。

Python实现

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        if x < 10:
            return True
        
        lastNum = x % 10
        x1 = lastNum
        #向下取接近除数的整数,注意负数的情况
        x = x // 10
        
        if 0 == lastNum:
            return False
        
        while(x > x1):
            lastNum = x % 10
            x = x // 10
            x1 = x1 * 10 + lastNum
            
        return x == x1 or x == (x1 // 10)

执行用时: 84ms,在所有Python3提交中击败 88.59%的用户。内存消耗: 13.8MB,在所有Python3提交中击败5.01%的用户

官解的时间一样,就是内存稍微少点点,感觉这个时间和内存的测量很诡异。

C++实现

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0)   return false;
        if(x < 10)  return true;
        
        int lastNum = x % 10;
        int x1 = lastNum;
        x = x / 10;
        
        if(0 == lastNum) return false;
        
        while(x > x1)
        {
            lastNum = x % 10;
            x1 = x1 * 10 + lastNum;
            x = x / 10;
        }
        
        return (x == x1) || (x == (x1 / 10));
    }
};

执行用时: 20ms,在所有Python3提交中击败 60.30%的用户。内存消耗: 8.1MB,在所有Python3提交中击败86.63%的用户

看看这C++的速度跟内存消耗,壮大我C++。

你可能感兴趣的:(leetcode,c++,python)