我试图解决 LeetCode 上的 this 问题,您必须使用函数反转整数。限制是,如果反转的数字超出有符号 32 位整数范围,即 (-2^31) 到 (2^31 - 1),则返回 0。当我像这样使用整数作为反转变量时
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
rev = rev * 10 + x % 10;
x /= 10;
}
if((rev > Integer.MAX_VALUE) || (rev < Integer.MIN_VALUE))
return 0;
return rev;
}
}
IntelliJ IDEA 表明
Condition 'rev > Integer.MAX_VALUE' is always 'false'
但是,当我使用 long 而不是 int 时,问题就解决了,程序按照您的预期运行。
class Solution {
public int reverse(int x) {
long rev = 0;
while (x != 0) {
rev = rev * 10 + x % 10;
x /= 10;
}
if((rev > Integer.MAX_VALUE) || (rev < Integer.MIN_VALUE))
return 0;
return (int)rev;
}
}
我想知道为什么会这样?
在第一个代码块中,
rev
是一个整数。因此,它不可能大于大于Integer.MAX_VALUE
(整数的最大值)。
对于
long
,其值可能大于最大可能的 int
值。 Java int
是一个带符号的 32 位值。 Java long
是有符号的 64 位值。
对我来说这有效...
class Solution {
public int reverse(int x) {
int mod = 0, rev = 0;
while(x!=0){
if(rev < Integer.MIN_VALUE/10 || rev > Integer.MAX_VALUE/10){
return 0;
}
mod = x%10;
x = x/10;
rev = rev*10 + mod;
}
return rev;
}
}
class Solution:
def reverse(self, x: int) -> int:
check_num = str(x)
flag = 0
if(check_num[0] == '-'):
check_num = check_num[1:]
flag = 1
#print(check_num)
#reverse
time = len(check_num)
storage = [0] * time
for i in range(len(check_num)):
num = len(check_num)-i-1
storage[i] = check_num[num]
#print(storage[i])
if(flag == 1):
storage.insert(0, '-')
#turn to string
oneLinerString=""
for x in storage:
oneLinerString += x
ans = int(oneLinerString) # removes leading zeros in the reversed string
if not -2**31 <= ans <= 2**31 - 1:
return 0
return ans
在 Leetcode 上尝试使用 Python 3 格式的代码,你将会通过..
在Java中,int数据类型是32位有符号整数,这意味着它可以保存从-2,147,483,648到2,147,483,647的值。如果转速超过此范围,它将溢出并回绕到最小值,即-2,147,483,648。因此,条件 rev > Integer.MAX_VALUE 永远不会为真。