题目等等上传。
这几天因为简书网站的问题,一直无法更新,导致做的题目都没法放上来。
然后联系了下网站负责者,没想到得到回复了。并且修复了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