新手算法學習之路----二分法(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;
        }
        
    }
相關文章
相關標籤/搜索