反转 32 位整数

新手上路,请多包涵

我正在尝试解决 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 <= (1 << 31)-1:
        return int(a[::-1])

    elif (-1 << 31) <= nums < 0:
        return -(int(a[:-len(a):-1]))
    else:
        return 0

这是我的问题:当我在网站上测试我的代码时:

 nums = 1534236469 # Fail
nums = 1463847412 # Success
nums = 9000000    # Success

为什么我当前的代码失败并显示 1534236469 ? --- 不在 1534236469 32 bit signed integers 范围内吗?我缺少什么?

原文由 Chiheb Nexus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 466
2 个回答

如评论中所述,您必须 先反转 然后检查。然而,这里有一种不同的检查方式。

要检查你可以 & 带有适当掩码的结果。

So in your case the limits are −2,147,483,648 and 2,147,483,647 the hex values of them are -0x80000000 and 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= -0x80000000pos_limit= 0x7fffffff 并根据解释的逻辑检查它们。

原文由 void 发布,翻译遵循 CC BY-SA 3.0 许可协议

解决方案已经存在,我发布这个是因为这可能对像我这样的新手有帮助。我使用了 void的 解决方案(上图)来完成它。起初,我没有执行反向方法就进行了测试,它显示了原始问题中提到的问题。然后我在颠倒正例和负例中的数字后进行了测试并且它起作用了。

 def reverse(self, x: int) -> int:
        neg_limit =-0x80000000 # hex(-2**31-1),see details in accepted answer above
        pos_limit = 0x7fffffff #hex(2**31-1)
        if x >0:
            reverse_num = int(str(x)[::-1])
            if reverse_num & pos_limit==reverse_num: #conditions explained above
                return reverse_num
            else:
                return 0

        elif x <0:
            reverse_num = -int(str(abs(x))[::-1])
            if reverse_num&neg_limit == neg_limit:
                return reverse_num
            else:
                    return 0
        else:
            return 0

原文由 hemanta 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题