作者:手机用户2502856895 | 来源:互联网 | 2023-02-01 10:03
我试图解决的exercie leetcode.com与交易signed 32bit integers
.
任务是:
返回带符号的32位整数的倒数,如果溢出32位有符号整数的范围则返回0.
在维基百科:
32位寄存器可以存储32个不同的值.可以以32位存储的整数值范围取决于所使用的整数表示.使用两个最常见的表示,范围是0到4,294,967,295(2 ^ 32 - 1)表示为(无符号)二进制数,而-2,147,483,648(-2 ^ 31)到2,147,483,647(2 ^ 31 - 1)表示作为两个补充.
所以,如果我理解的是正确的,我应该在间隔之间进行测试0 to (2^31)-1
,(-2^31) to 0
否则,返回0
.
这是我的代码:
def reverse_int(nums):
a = str(nums)
if 0
这是我的问题:当我在网站上测试我的代码时:
nums = 1534236469 # Fail
nums = 1463847412 # Success
nums = 9000000 # Success
为什么我当前的代码失败1534236469
?不在1534236469
范围内32 bit signed integers
?我错过了什么?
1> void..:
如评论中所述,您必须首先撤消然后检查.然而,这是一种不同的检查方式.
要检查您是否可以&
使用适当的掩码获得结果.
所以在你的情况下,限制是?2,147,483,648
和2,147,483,647
它们的十六进制值是-0x80000000
和0x7fffffff
在解释器中试试这个.
>>> 0x7fffffff
2147483647
>>> 2147483647 & 0x7fffffff #within limit
2147483647
超出限制的值,您可以看到显示的其他一些值.
>>> 2147483648 & 0x7fffffff #Exceeds limit
0
>>> 98989898989898 & 0x7fffffff #Exceeds limit
1640235338
但是当价值在限度内时.该值作为输出给出.
>>> 1 & 0x7fffffff #within limit
1
>>> 780 & 0x7fffffff
780
对于负值
>>> -0x80000000 #Limit
-2147483648
>>> -2147483648 & -0x80000000
-2147483648
当值在范围内时.该限制是作为输出.
>>> -2147483647 & -0x80000000
-2147483648
>>> -2 & -0x80000000 #within limit
-2147483648
>>> -2323 & -0x80000000
-2147483648
但是,如果值超出范围,您可以看到显示其他一些值.
>>> -2147483649 & -0x80000000
-4294967296
>>> -999999999999 & -0x80000000
-1000727379968
你可以很好地利用这个,并获得你想要的东西!
这是一个完成你想要的程序.
def reverse(x):
str_x = str(x)
if x<0:
str_x = '-'+str_x[::-1][:-1]
x = int(str_x)
else:
str_x = str_x[::-1]
x = int(str_x)
neg_limit= -0x80000000
pos_limit= 0x7fffffff
if(x<0):
val=x&neg_limit
if(val==neg_limit):
return x
else:
return 0
elif(x==0):
return x
else:
val = x&pos_limit
if(val==x):
return x
else:
return 0
value = int(input("Enter value: "))
print(reverse(value))
下面的部分只是反转了负值和正值.
if x<0:
str_x = '-'+str_x[::-1][:-1]
x = int(str_x)
print(x)
else:
str_x = str_x[::-1]
x = int(str_x)
print(x)
设置限制 neg_limit= -0x80000000
并pos_limit= 0x7fffffff
根据解释的逻辑检查它们.
是的,但是想提到使用`&`并使用`mask`
或者,以更简单的方式比较`str_x`的反转`int`,如果它在`( - 1 <<31)`和`(1 <<31)-1`之间.如果没有返回&#39;0`.顺便说一句,你的方法也是正确的,但过于冗长.