新手算法学习之路----二分法(FirstBadVersion)

 

第一个出错的版本号

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

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

我所犯的错1,刚开始没有后面注释为问好的语句,我开始是直接return start;这样在只有最后一个版本号出错的时候就会出问题,应该输出n的结果是n-1。

                 2,如果是直接 return end;这样在所有的版本号有问题的时候就会出问题,应该输出为1,结果输出2. 因为当程序进行的 start = 1,end=2的时候就会退出while(),当执行return end的时候就会出错。

                 3,  mid = (start+end)/2;    当n为2147483647的时候就会溢出

                        mid = start + (end - start)/2; 这样会防止溢出,如果是n=2147483647的时候就不会溢出。

public int findFirstBadVersion(int n) {
        // write your code here
        int start = 1;
        int end = n, mid= -1;
        
        while(start+1<end){
            //mid = (start+end)/2;         //当n为2147483647的时候就会溢出
            mid = start + (end - start)/2; //下面的语句好一点,这样可以防溢出,
            if(SVNRepo.isBadVersion(mid)){
                end = mid;
            }
            else{
                start = mid;
            }
        }
        if(SVNRepo.isBadVersion(start)){ //????到最后只有两个元素需要判断,
            return start;
        }
        else{
            return end;
        }
        
    }

 

posted @ 2017-07-06 15:43  JunLiu37  阅读(196)  评论(0编辑  收藏  举报