java - 如何正确处理 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 值溢出)还是有更优雅的方法来处理这个?
解决方案
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
。
推荐阅读
- swift - var a = 5 和 var a = Int(5) 有什么区别?
- python - 当我从我的数据库中提取主键时,它们会出现在括号中,我以后无法在我的代码中使用它们
- android - 如何使用设备场为 BOOT_COMPLETED 和 USER_PRESENT 接收器创建自动化测试?
- python - Colab教程使用object_detection进行迁移学习,为什么lookup_ops.py中出现TypeError?
- ansible - 获取ansible mongo模块的IP
- java - 使用类路径外的配置文件创建 CacheManager bean
- bash - 使用 wget 命令下载目录
- excel - 为什么编译器会抛出错误类型不匹配
- android - MVVM - 使用 LiveData 的自定义选项卡布局控件
- excel - 大范围的分离细胞