我正在处理LeetCode提出的问题(不是正在练习的面试问题),该问题如下:
Given a sorted integer array nums, where the range of elements are in the inclusive range [lower, upper], return its missing ranges.
我想出的代码对于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-statements
来专门处理这两个数字(或者如果数字的加/减导致int值溢出),或者有一种更优雅的方式来处理这个数字?
答案 0 :(得分:4)
int
的最大值为2 31 -1,即2147483647,但是该数字与 any 负数之间的差大于该数字。数字本身。
因此,您所有的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
。