算法题解-错误的版本

126 阅读2分钟

题目

假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本

输入: n = 5, bad = 4
输出: 4

题解

第一种

我们先在函数中声明了一个内部函数并直接将其返回,在内部函数中我们接受一个参数n,参数n代表着版本的总数,然后我们声明了两个变量min和max,并将它们分别初始化为1和n,这两个变量用于表示版本号的最小值和最大值,接下来我们使用条件判断去检查第一个版本是否出错,如果第一个版本出错,则直接返回版本号1,然后我们使用一个循环去执行二分查找,我们设定循环的条件为min <= max,其中min和max分别表示当前的版本号范围的最小值和最大值,在循环中,我们通过计算中间版本号mid,使用Math.floor((min+max)/2)来获取,接下来使用条件判断来确定中间版本号的状态,如果中间版本号和它的下一个版本号都出错则说明第一个出错的版本号在当前范围的左侧,我们将max更新为mid - 1,如果中间版本号和它的下一个版本号都没有出错,说明第一个出错的版本号在当前范围的右侧,我们将min更新为mid + 1,如果中间版本号没有出错,但它的下一个版本号出错,说明中间版本号就是第一个出错的版本号,我们直接将mid+1返回该版本号,如果循环结束后,我们没有找到出错的版本号,我们则返回-1即可

var solution = function(isBadVersion) {
    return function(n) {
        let min = 1;
        let max = n;
        if(isBadVersion(1)){
            return 1;
        }
        while(min <= max){
            let mid = Math.floor((min+max)/2);
            if(isBadVersion(mid) && isBadVersion(mid+1)){
                max = mid - 1;
            }
            if(!isBadVersion(mid) && !isBadVersion(mid+1)){
                min = mid + 1;
            }
            if(!isBadVersion(mid) && isBadVersion(mid+1)){
                return mid+1;
            }
        }
        return -1;
    };
};

第二种

我们在函数中声明一个匿名函数并返回出去,这个返回出去的函数接受一个参数n,表示版本的总数,在返回出去的函数中,我们使用了一个循环来逐个检查版本,循环初始值是n,我们从最新的版本开始检查,循环的条件是i>=1,我们这里判断只要版本号大于等于1,就继续执行循环,在循环中,我们先首先检查当前版本号i是否为1,如果是则说明这就是第一个错误版本,我们直接返回即可,如果当前版本号不是1,我们就继续判断它和前一个版本号的错误状态,我们通过调用isBadVersion函数来判断版本号是否为错误版本,如果当前版本是错误版本,而前一个版本不是错误版本,说明当前版本就是第一个错误版本,我们将其返回即可,如果当前版本不是错误版本,或者前一个版本也是错误版本,我们继续循环,继续检查下一个版本即可

var solution = function(isBadVersion) {
    return function(n) {
        for(let i=n;i>=1;i--){
            if(i == 1){
                return i;
            }
            if(isBadVersion(i) == true && isBadVersion(i-1) == false){
                return i;
            }
        }
    };
};

坚持努力,无惧未来!