Lintcode74:第一个错误的代码版本(二分法)

描述

代码库的版本号是从 1 到 n 的整数。某一天,有人提交了错误版本的代码,因此造成自身及之后版本的代码在单元测试中均出错。请找出第一个错误的版本号。

你可以通过 isBadVersion 的接口来判断版本号 version 是否在单元测试中出错,具体接口详情和调用方法请见代码的注释部分。

请阅读上述代码,对于不同的语言获取正确的调用 isBadVersion 的方法,比如java的调用方式是SVNRepo.isBadVersion(v)

样例

给出 n=5

调用isBadVersion(3),得到false

调用isBadVersion(5),得到true

调用isBadVersion(4),得到true

此时我们可以断定4是第一个错误的版本号

挑战

调用 isBadVersion 的次数越少越好


思路: 这题使用二分法就ok了,但是有一个注意的地方:

以前我使用二分法都是 mid = (start+end)/2 就好了,但是这一题的话这样写会过不了的,需要这样写:

mid = start + (end - start) / 2,原因如下:

防止Stack Overflow。假设start 和 end 都很大(但是在int的value range里面)如果两个都很大加起来就可能会超过2,147,483,647。


Java代码:

    public int findFirstBadVersion(int n) {
        // write your code here
        int pre = 1, last = n;
        while(pre<last){
            int mid = pre + (last - pre) / 2;
            if(SVNRepo.isBadVersion(mid)){
                last = mid;
            }else{
                pre = mid+1;
            }
        }
        return pre;
    }


猜你喜欢

转载自blog.csdn.net/u012156116/article/details/80724740