0
点赞
收藏
分享

微信扫一扫

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1

思考的鸿毛 2022-01-06 阅读 24
团队开发

Java:

/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
       int low=1,high=n;
        while(low<=high){
            if(n==1){return 1;}
            int mid=low+(high-low)/2;
            if(isBadVersion(mid)){
                high=mid;
            }
            else{
                low=mid+1;
            }
            if(low==high){return high;}
    }
        return high+1;
        }
}

写成mid=(low+high)/2会越界,而写成mid=low+(high-low)/2不会越界的原因:

int 取值范围
java语言中int的取值范围为:-2147483648 ~ 2147483647解释如下:int类型在java语言中占4个字节,即32个二进制位。当表示正数时,最高位为符号位(符号位为0),最大的正数是 0111 1111 1111 1111 1111 1111 1111 1111 即2^31 -1 = 2147483647当表示负数时,最高位为符号位(符号位为1),最小的负数是 1000 0000 0000 0000 0000 0000 0000 0000 而在计算机中是以补码的形式存储的,java语言规定 1000 0000 0000 0000 0000 0000 0000 0000 的补码为-2147483648所以java语言中int的取值范围为:-2147483648~2147483647

假设入参的最大值为max = 2^31 -1
1、int mid = (left + right) /2;
2、int mid = left + (right - left) / 2;
1式执行代码的时候,假设要找的值时max/2 的右边时,会出现
int mid = (left + right) /2 = (max + max /2)/2 的情况。
因为max + max /2是恒大于max的,所以出现溢出
2式执行代码的时候,假设要找的值时max/2 的右边时,会出现
int mid = left + (right - left) / 2 = (max - max/2)/2的情况
因为max - max/2 是恒小于 max 的,所以不会出现溢出问题。

举报

相关推荐

0 条评论