第一个错误的版本

第一个错误的版本

 

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例:

给定 n = 5,并且 version = 4 是第一个错误的版本。
​
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
​
所以,4 是第一个错误的版本。 

我的思路

思路一

按题目所述,其实就是一个数组里,找出第一个调用Api之后,从false变成true的。

所以这里我使用了两个index,一个指向数组的开头,一个末尾。不断迭代,获取中间值的版本正确性,把两个index做相对应的调整。迭代的条件则为开头和结尾是否差为1。

另外要注意的是我这边因为出现了精度问题,所以我这里先是用long获取中间值,然后在赋值回给int值。

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        if(n == 2){
            if(isBadVersion(1)){
                return 1;
            }else{
                return 2;
            }
        }
        if(n == 1){
            return 1;
        }
        long isTrueIndex = n;
        long isFalseIndex = 0;
        int tempIndex = 0;
        long tempLong = 0;
        while(isTrueIndex - isFalseIndex!=1){
            tempLong = (isFalseIndex + isTrueIndex)/2;
            tempIndex = (int)tempLong;
            if(isBadVersion(tempIndex)){
                isTrueIndex = tempIndex;
            }else{
                isFalseIndex = tempIndex;
            }
        }
        return (int)isTrueIndex;
    }
}

答案思路

思路一

跟我的思路一致,但代码优化得很好,可以学习,

1.判断机制改为了直接是否两个index的大小对比,与前面我的思路相比,少了一个减法的过程。

2.将我的精度转换的过程取消掉了,采用了 l + (r - l) / 2来算。。

减少了1ms的延迟。该答案10ms,我的答案13ms。

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int l = 1, r = n;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (isBadVersion(mid))
                r = mid - 1;
            else
                l = mid + 1;
        }
        return isBadVersion(l) ? l : l + 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值