问题描述
由于某种原因,这段代码只失败了 4 种情况,即当通过 1534236469 时,它应该返回 0 但返回 2147483647。
编辑:代码应该反转它传递的值。如果给定 123,则需要返回 321。
sudo
解决方法
您有未检测到的 int
溢出。
Math.pow(2,31)
是 2 147 483 648。类似地,Math.pow(-2,31)
是 -2 147 483 648。您尝试反转的值 1 534 236 469 正好在这些范围内。因此,您的方法会在可能返回 0 的开头跳过 if
语句。
然后它尝试反转数字。反过来应该是 9 646 324 351。但是这个数字太大了,无法放入 32 位带符号的 int
。 Java 所做的是丢弃最前面的位(最重要的位)。这势必会给我们一个无意义的结果。这恰好是 2 147 483 647(可以放入 int
的最大数字)。
解决方案?一种方法是在 long
而不是 int
中计算总和。这将确保您没有溢出。如果你想在 int
溢出的情况下返回 0,那么最后检查总和是否小于 2^32,如果不是,则返回 0。