题目:
We are playing the Guess Game. The game is as follows:
I pick a number from 1 to n. You have to guess which number I picked.
Every time you guess wrong, I'll tell you whether the number is higher or lower.
You call a pre-defined API guess(int num)
which returns 3 possible results (-1, 1 , or 0):
-1 : My number is lower
1 : My number is higher
0 : Congrats! You got it!
Example:
n = 10,I pick 6.
Return 6.
实力吐槽!这题其实本质上非常简单,简单的不要不要的,但是看懂题实在太费劲了,以致于笔者花了一个小时!是一个小时!!才把这题的“你、我”这俩人称看明白!!
!!!这就是个二分查找!!!
不好意思一不小心师太了~~这题确实理解上容易出问题。接下来好好说思路,避免大家也因为题意影响到编程。
思路:
这题的意思是,我们两个人玩猜数游戏。我从1到n里面选择一个数字,你来猜。每次你猜错的时候呢,我就会告诉你,你猜大了,或者猜小了,直到你猜对为止!类似于一些真人秀设置的游戏规则。。。
注意!这里他告诉我们他已经写好了一个接口guess(int num),有三个返回值:这里我好好翻译一下
返回-1,代表我们选的数字比对方猜的小
返回** 1,代表我们选的数字比对方猜的大**
返回** 0**,代表你猜对了
还有!他给我们准备的代码里:guessNumber(int n),这个n是我们设置的最大数,不是他猜的,是让我们设置好最大数,他猜数字,比如他猜了6,那结果就需要返回6,不过中间要有判断的过程。
好的我们整理一下我们要做的事情:我们设置最大数字,对方猜,我们只能给他反馈他猜大了或者猜小了。那他猜的过程是什么样的呢?那就要由我们来编译了!这里推荐使用折半的方法。我在代码里尽量设置清楚备注。
public class Solution extends GuessGame {
public int guessNumber(int n) {
//如果设置的最大数字他直接猜对了,那就可以直接返回这个最大数了
if(guess(n)==0) {
return n;
}
int low = 1;
int high = n;
while(low<high){
//这里的mid不可以使用 int mid = (low+high)/2;
int mid = low + (high-low)/2;
int res = guess(mid);
if(res==0) {
//如果对方猜对了直接输出~
return mid;
}else if(res == 1){
//如果对方猜的数字,比我们设置的数字小!那就把mid赋值给low,让对方下次猜的数变大~
low = mid+1;
}else {
//其余情况只有对方猜的数字,比我们设置的数字大!那就把mid赋值给high,让对方下次猜的数变小~
high = mid-1;
}
}
//最后如果在while中,没有猜对(基本上不可能)!那他猜的这个数字,一定是现在的low了~~
return low;
}
}