Leetcode - First Bad Version

题目等等上传。
这几天因为网站的问题,一直无法更新,导致做的题目都没法放上来。
然后联系了下网站负责者,没想到得到回复了。并且修复了bug,挺不错。

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        if (n <= 0)
            return -1;
        int begin = 1;
        int end = n;
        while (begin < end) {
            int mid = (begin + end) / 2;
            if (isBadVersion(mid))
                end = mid;
            else
                begin = mid + 1;
        }
        return begin;
    }
}

这道题目卡了我很久。。。
为什么,原因很傻逼。
也是我一直以来思维的缺陷。
binary search 的时候,我一般这么操作。
int mid = (begin + end) / 2;
但是这个含有一个隐藏的bug。
如果begin,end都很大,就可能会溢出。然后造成bug
以后都要换种写法:
int mid = begin + (end - begin) / 2;
然后这道题目本身没有任何难度。。。
日了狗了,卡了这么久。

上次微软面试后,我觉得不甘心,又把那人当场给的那道题目回家重做了一遍,做出来了。然后我给那人发过去了,算是做最后一次挣扎。。。没想到,竟然回复了。但是不是那个面试官。是负责联系的人。他说他把我的代码发给那个人了。。
其实对这次结果也不报多少希望了。但是,凡事尽力,才是对的。
比如这次。
随缘吧。

**
总结:
int mid = (begin + end) / 2; 隐藏有小bug
以后统一用:
int mid = begin + (end - begin) / 2;
**

Anyway, Good luck, Richardo!

第二次做还是没做出来。。。
Fuck...
中间值会溢出。
Take care.

Anyway, Good luck, Richardo!

My code:

/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        if (n <= 0) {
            return -1;
        }
        
        int begin = 1;
        int end = n;
        while (begin < end) {
            int mid = begin + (end - begin) / 2;
            if (isBadVersion(mid)) {
                end = mid;
            }
            else if (!isBadVersion(mid)) {
                begin = mid + 1;
            }
        }
        
        return begin;
    }
}

简单题目。
和 Search Insert Position 有点区别。
注意比较。
那个是找到一个插入位置。
loop condition: begin <= end
然后最后返回的是,end

这里的
loop condition: begin
最后返回end, or begin 都可以。

Anyway, Good luck, Richardo! -- 09/01/2016

你可能感兴趣的:(Leetcode - First Bad Version)