美文网首页ACM题库~
[LeetCode-Easy]374. -猜数Guess Num

[LeetCode-Easy]374. -猜数Guess Num

作者: AceCream佳 | 来源:发表于2016-08-21 08:44 被阅读38次

题目:

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

}

相关文章

网友评论

    本文标题:[LeetCode-Easy]374. -猜数Guess Num

    本文链接:https://www.haomeiwen.com/subject/bnnisttx.html