我正在解决 LeetCode 中的一个问题(不是只是练习的面试问题),它提出以下问题:
给定一个排序的整数数组 nums,其中元素范围在包含范围 [lower, upper] 内,返回其缺失的范围。
我想出的代码对于 nums
数组为 [-2147483648,2147483647]
和 lower/upper
的输入失败分别为-2147483648/2147483647
。我的代码中实际回答问题的部分是:
if (nums[0]-lower > 1) {
String range = lower + "->" + (nums[0]-1);
ans.add(range);
}
else if (nums[0]-lower == 1) {
String range = new Integer(lower).toString();
ans.add(range);
}
for (int i = 1; i < nums.length; i++) {
if (nums[i] - nums[i-1] > 2) {
String range = nums[i-1]+1 + "->" + (nums[i]-1);
ans.add(range);
}
else if (nums[i] - nums[i-1] == 2) {
String range = new Integer(nums[i]-1).toString();
ans.add(range);
}
}
我想知道如何最好地处理这种边缘情况,不仅是针对这个问题,而且是一般情况。我是否只是在代码中添加额外的 if 语句来专门处理这两个数字(或者如果数字的加法/减法导致 int 值溢出),或者是否有更优雅的方法来处理这个问题?
最佳答案
int
的最大值为 231-1,即 2147483647,但该数字与任何负数之间的差异为大于该数字本身。
因此,所有减法表达式(例如 nums[0]-lower
)都会溢出 [-2147483648,2147483647]
(或 [-1,2147483647]
).
你可以用这个来检查:
System.out.println(2147483647 - -1);
这会打印出 -2147483648
,即使您希望它是 2147483648
。
一个简单的解决方法是将计算作为 64 位 long
进行。如下所示更改所有减法,将表达式转换为 long
。
if (nums[0] - (long)lower > 1) {
将上面的例子改为:
System.out.println(2147483647 - (long) -1);
这将正确打印 2147483648
。
关于java - 如何正确处理max/min int值边缘情况-Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51015291/