[LeetCode-Easy]374. -猜數Guess Number Higher or Lower字大小

題目:

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;
  }

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容