https://leetcode.com/problems/number-complement/
下面是这个问题的两个有效解决方案,为什么我在第一个解决方案中遇到整数溢出 mask
变量应该是int(而不是long),为什么我可以用int变量类型作为 mask
在第二种解决方案中
public int findComplement(int num) {
// Make a copy of the number for length estimation purposes , because we will begin mutating it
// directly
int input = num;
// Use a power of two mask to bring 1 at every position and flip in stages using XOR
for (long mask = 1; mask <= input; mask *= 2) {
num = (int) (num ^ mask);
}
return num;
}
public int findComplement2(int num) {
int save = num;
int mask = 1;
while (save != 0) {
num = num ^ mask;
mask = mask << 1;
save = save >> 1;
}
return num;
}
1条答案
按热度按时间nwlqm0z11#
你的身体状况
for
循环设置要求mask
必须大于的值input
终止。但是,当你使用Integer.MAX_VALUE
作为输入,将没有其他int
值大于Integer.MAX_VALUE
,这将阻止for
循环。所以你的for
循环将永远运行,因为将永远
true
如果变量mask
属于类型int
(或更小)。为了阻止
for
循环必须使用类型long
对于变量mask
所以有可能mask <= input
将导致false
如果输入值Integer.MAX_VALUE
已使用。在第二个方法中,还可以在整数溢出中运行
mask
将从1073741824跳到-2147483648。但是,在这种情况下save
将为零,终止while
循环save != 0
检查。所以事实上mask
如果整数溢出为负,则没有任何后果。