有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何正确处理最大/最小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) 个答案

  1. # 1 楼答案

    一个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