如何正确处理max / min int值边缘情况-Java

时间:2018-06-25 01:36:00

标签: java

我正在处理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 个答案:

答案 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