【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
说明:
-
//
除法会向下取整,相当于math.floor(a/b)
,这对于 负数取整 而言会带来灾难。比如-123 // 10
的结果为-13
,这是因为-123 // 10
的直接除法结果为-12.3
,然后向下取整为-13
。本题我们直接用 浮点数除法/
外加 取整函数int()
即可。 -
sys.maxsize
将获得64
位整数的最大值,我们想要int32
,则右移 32 位即可,同时注意运算符优先级>>
低于+
,最小值 ⌈ \lceil ⌈ 取负减一 ⌋ \rfloor ⌋ 即可得到。 -
取余运算
%
也要注意分 正、负 数两种情况,比如-3 % 10 = 7
、-3 % -10 = -3
,3 % 10 = 3
、3 % -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 对比,主要不同点:
-
C/C++ 是强类型语言,除法
/
对于两个整型变量运算来说就是 截断取整。 -
头文件
limits.h
中包含了整型最大值INT_MAX
和 最小值INT_MIN
,当然也可以通过2*(1<<30-1)+1
和-2*(1<<30)
分别获得。 -
取余运算的模的正、负不影响结果 ,比如
-3 % 10 = -3
、-3 % -10 = -3
、3 % 10 = 3
、3 % -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++ 基本一致。