題目:
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里面選擇一個數字,你來猜。每次你猜錯的時候呢,我就會告訴你,你猜大了,或者猜小了,直到你猜對為止!類似于一些真人秀設置的游戲規(guī)則。。。
注意!這里他告訴我們他已經寫好了一個接口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;
}
}