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

 

第一个出错的版本号单元测试

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

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

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

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

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

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

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;
        }
        
    }
相关文章
相关标签/搜索