首页 > 解决方案 > 如何正确处理 max/min int value edge case-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 值溢出)还是有更优雅的方法来处理这个?

标签: java

解决方案


an 的最大值int是 2 31 -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


推荐阅读