第乙個錯誤的版本

2021-09-02 23:24:34 字數 1450 閱讀 1701

leetcode鏈結

你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。

假設你有n個版本[1, 2, ..., n],你想找出導致之後所有版本出錯的第乙個錯誤的版本。

你可以通過呼叫bool isbadversion(version)介面來判斷版本號version是否在單元測試中出錯。實現乙個函式來查詢第乙個錯誤的版本。你應該儘量減少對呼叫 api 的次數。

示例:

給定 n = 5,並且 version = 4 是第乙個錯誤的版本。呼叫 isbadversion(3) -> false

呼叫 isbadversion(5) -> true

呼叫 isbadversion(4) -> true

所以,4 是第乙個錯誤的版本。

思路:一眼望過去,管它三七二十一,先來個暴破再說?

public int firstbadversion(int n) 

}return n;

}

不用想,肯定超時了。leetcode上的簡單題,一般都不需要怎麼想,主要是考察細心程度,情況有沒有考慮全而已。接下來用遞迴實現二分的

public int firstbadversion(int n) 

public int firstbadversion(int lo, int hi)

int mid = (hi - lo) / 2 + lo; //這裡是為了防止int溢位

if (isbadversion(mid)) else

}

其實很是需要細心一點的,兩數相加要考慮溢位的情況,這裡可以使用(hi - lo ) / 2 + lo計算平均值,而不是直接使用(hi + lo) / 2計算。

另外,在遞迴結束條件和遞迴傳參方法上也可以進行小改動。(如果傳的時mid - 1,那麼迴圈結束的條件必須是lo > hi而不能包括等於的情況)

public int firstbadversion(int n) 

public int firstbadversion(int lo, int hi)

int mid = (hi - lo) / 2 + lo;

if (isbadversion(mid)) else

}

根據遞迴也可以很快的寫出迭代的實現方法

public int firstbadversion(int n) 

return lo;

}

總結一下,這道題值得注意的點在於邊界值的處理還有兩數相加溢位的情況。

第乙個錯誤的版本

你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool isbadversio...

第乙個錯誤的版本

你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool isbadversio...

第乙個錯誤的版本

你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool isbadversio...