【LeetCode】#7 整数反转 Python3 | C/C++ | C# 实现

【LeetCode】#7 整数反转 Python3 | C/C++ | C# 实现

题目链接:7.整数反转
解题思路:详见官网题解,这里主要看看不同语言的实现,从中我们学习并捕获不同高级语言之间的差异。

Python3

class Solution:
    def reverse(self, x: int) -> int:
        rev:int = 0
        INT_MAX:int = sys.maxsize>>32
        INT_MIN:int = -(sys.maxsize>>32)-1
    
        while x != 0:
            pop:int = x % 10 if x > 0 else x % -10
            if rev > INT_MAX // 10 \  # 换行
            or rev == INT_MAX // 10 and pop > INT_MAX % 10:
                return 0
            elif rev < int(INT_MIN/10)  \  # 换行
            or rev == int(INT_MIN/10) and pop < INT_MIN % -10:
                return 0
            else:
                rev = rev*10 + pop
            x = int(x / 10)
                    
        return rev

说明:

  1. // 除法会向下取整,相当于 math.floor(a/b),这对于 负数取整 而言会带来灾难。比如 -123 // 10 的结果为 -13,这是因为 -123 // 10 的直接除法结果为 -12.3,然后向下取整为 -13。本题我们直接用 浮点数除法 / 外加 取整函数 int() 即可。

  2. sys.maxsize 将获得 64 位整数的最大值,我们想要 int32,则右移 32 位即可,同时注意运算符优先级 >> 低于 +,最小值 ⌈ \lceil 取负减一 ⌋ \rfloor 即可得到。

  3. 取余运算 % 也要注意分 正、负 数两种情况,比如 -3 % 10 = 7-3 % -10 = -33 % 10 = 33 % -10 = -7,这里我们对正数用正模,对负数用负模,确保绝对值大小不变。


C/C++

class Solution {
    
    
public:
    int reverse(int x) {
    
    
        int rev = 0;
        while (x != 0){
    
    
            int pop = x % 10;
            if (rev > INT_MAX / 10 || 
                rev == INT_MAX / 10 && pop > INT_MAX % 10)
                return 0;
            else if(rev < INT_MIN / 10 ||
                rev == INT_MIN / 10 && pop < INT_MIN % 10)
                return 0;
            rev = rev * 10 + pop;
            x /= 10;
        }
        return rev;
    }
};

与 Python3 对比,主要不同点:

  1. C/C++ 是强类型语言,除法 / 对于两个整型变量运算来说就是 截断取整

  2. 头文件 limits.h 中包含了整型最大值 INT_MAX 和 最小值 INT_MIN,当然也可以通过 2*(1<<30-1)+1-2*(1<<30) 分别获得。

  3. 取余运算的模的正、负不影响结果 ,比如 -3 % 10 = -3-3 % -10 = -33 % 10 = 33 % -10 = 3。换言之,数取余后符号不变。


C#

public class Solution {
    
    
    public int Reverse(int x) {
    
    
        int rev = 0;
        while (x != 0){
    
    
            int pop = x % 10;
            if(rev > int.MaxValue / 10 || 
                rev == int.MaxValue / 10 && pop > int.MaxValue % 10)
                return 0;
            else if(rev < int.MinValue / 10 ||
                rev == int.MinValue / 10 && pop < int.MinValue % 10)
                return 0;
            rev = rev * 10 + pop;
            x /= 10;
        }
        return rev;
    }
}

所讨论的特性与 C/C++ 基本一致。

猜你喜欢

转载自blog.csdn.net/weixin_42430021/article/details/109901303