描述
代码库的版本号是从 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; }