需求描述
你是产品经理,目前正在带领团队开发新的产品。不幸的是,你的产品最近版本没有通过质量检测。由于每个版本都是机遇之前的版本开发的,所以错误的版本之后所有的版本都是错的。
假设你有N个版本【1,2.....N】,你想找出导致错误之后所有版本出错的第一个错误版本。
你可以通过调用bool isBadVersion(version)接口来判断错误版本好version是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少调用APi的次数。
问题解析
目的就是要找出第一个错误的版本,比如版本好有1,2,3,4,5,6,7,8,9
。
其中1,2,3,4
都是正确的版本,从4
之后版本都是错误的。
所以当调用isBadVersion(n)
,当n=1..4
的时候,返回的boolean
都是false
,因为是正确的,所以返回false;
当n > 4
之后 isBadVersion(n)
的时候返回的就是true
。
找到第一个返回true的值。
例如当前传入的n=7
.
你用n
递减去试isBadVersion
返回的的值是否等于false
。当得到第一个false
的时候,你返回n+1
就是一个错误的版本。
当然,题目中也说了尽量减少调用APi的次数。所以,常用的就是二分法就查找。
代码示例
代码引用自@数据结构与算法
public int firstBadVersion(int n) {
int start = 1,end = n;
while(start < end){
//取中间值
int mid = (end - start) / 2 + start;
/**
如果中间的数字得到的正确的版本,那么start = mid+1
如果中间的数字得到错误的版本号,那么end = mid;
*/
if(!isBadVersion(mid)){
start = mid + 1;
}else{
end = mid;
}
}
return start;
}