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

标签 java

我正在解决 LeetCode 中的一个问题(不是只是练习的面试问题),它提出以下问题:

给定一个排序的整数数组 nums,其中元素范围在包含范围 [lower, upper] 内,返回其缺失的范围。

我想出的代码对于 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 语句来专门处理这两个数字(或者如果数字的加法/减法导致 int 值溢出),或者是否有更优雅的方法来处理这个问题?

最佳答案

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

关于java - 如何正确处理max/min int值边缘情况-Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51015291/

相关文章:

java - 在 ApplicationInsights V3 无代码方法中抑制遥测类型

java - 如何从 AJAX 数据中获取响应消息

java - 从表中读取数据时出现问题

java - 带有默认抛出子句的枚举?

Java Immutable Collection,也修复引用

以 UTF-8 编码的 JAVA Http POST 请求

Java GC 日志充满了奇怪的字符

java - 使用正则表达式查找 zip 文件中的文件

java - Tomcat 意外关闭

java - JAVA继承中的重写与重载