欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第一个错误的版本

程序员文章站 2022-04-19 17:44:28
你是产品经理,目前正在领导一个团队开发一个新产品。不幸的是,您的产品的最新版本没有通过质量检查。由于每个版本都是基于之前的版本开发的,所以错误版本之后的所有版本都是不好的。 假设你有 n 个版本 [1, 2, ..., n],你想找出第一个错误的版本,导致下面所有的错误。 你可以通过 bool is ......

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

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

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

 

很容易想到二分法,时间复杂度为log(N),然后写了如下代码

// Forward declaration of isBadVersion API.
bool isBadVersion(int version);

class Solution {
public:
int firstBadVersion(int n) {
  int l=0;
  int r=n;
  int mid=0;
  while(l<r)
  {
    mid=(l+r)/2;
    if(!isBadVersion(mid))
      l=mid+1;
    else
      r=mid;
  }
  return l;
 }
};

然后自信满满提交,发现在过接近int范围的大数时出错了,百度下看了别人的代码才发现,

(l+r)/2在处理大数时会超出int范围,

从而修改代码

// Forward declaration of isBadVersion API.
bool isBadVersion(int version);

class Solution {
public:
int firstBadVersion(int n) {
  int l=0;
  int r=n;
  int mid=0;
  while(l<r)
  {
  mid=l+(r-l)/2;
  if(!isBadVersion(mid))
    l=mid+1;
  else
  r=mid;
  }
  return l;
  }
};

成功过。