如何正确处理最大/最小int值
我正在处理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值溢出),还是有更优雅的方法来处理这两个数字
# 1 楼答案
一个
int
的最大值为231-1,即2147483647,但该数字与任何负数之间的差值大于该数字本身因此,所有减法表达式(如
nums[0]-lower
)都会溢出[-2147483648,2147483647]
(或[-1,2147483647]
)您可以通过以下方式进行检查:
这将打印出
-2147483648
,即使您希望它是2147483648
一个简单的解决方法是将计算作为64位
long
。更改所有减法,如下所示,将表达式转换为long
以上述示例为例,将其更改为:
这将正确打印
2147483648