我正在尝试解决问题:
给出一个32位带符号整数(整数的倒数),当反向整数溢出时返回0。
我的解决方法是:
public int reverse(int x)
{
int reversedNumber = 0;
boolean isNumberNegative = x < 0;
x = Math.abs(x);
while (x >= 10)
{
reversedNumber = reversedNumber * 10 + (x % 10);
x = x / 10;
}
reversedNumber = reversedNumber * 10 + x;
return isNumberNegative ? -1 * reversedNumber : reversedNumber;
}
我的问题是溢出,如何在不使用reversedNumber
实用程序类或Math
的情况下检查long
是否溢出?
答案 0 :(得分:1)
您可以利用int
到long
的转换,反之亦然,因为long
大于Integer.MAX_VALUE
但小于Integer.MIN_VALUE
会溢出当投射回int
时,可以在最后两行中看到:
public int reverse(int x) {
long reversedNumber = 0;
boolean isNumberNegative = x < 0;
x = isNumberNegative ? -x : x;
while (x >= 10) {
reversedNumber = reversedNumber * 10 + (x % 10);
x = x / 10;
}
reversedNumber = reversedNumber * 10 + x;
reversedNumber = isNumberNegative ? -reversedNumber : reversedNumber;
int result = (int) reversedNumber ;
return reversedNumber != result ? 0 : result;
}
答案 1 :(得分:0)
您可以尝试这样做,而无需任何强制转换:
public int reverse(int x) {
int reversedNumber = 0;
int digitCount = 1;
x = Math.abs(x);
while (x >= 10) {
if(digitCount >= 9 && willOverflow(reversedNumber)){
return 0;
}
reversedNumber = reversedNumber * 10 + (x % 10);
x = x / 10;
digitCount++;
}
if(willOverflow(reversedNumber)){
return 0;
}
reversedNumber = reversedNumber * 10 + x;
if(reversedNumber < 0){
return 0;
}
return reversedNumber;
}
private boolean willOverflow(int reversedNumber) {
int tmpMultiply = reversedNumber * 10;
int tmpDivide = tmpMultiply / 10;
return tmpDivide != reversedNumber;
}
如果我相信您可以通过将整数乘以10然后除以10来检查整数是否会溢出,则如果末尾的值与传递的值不同,则可以假定整数将在下一次迭代中溢出(如果有)下一个迭代)。