猜数字大小 | LeetCode刷题笔记

641 阅读2分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战


  • 相关文章

    LeetCode刷题汇总:LeetCode刷题

    一、题目描述


    猜数字大小

    猜数字游戏的规则如下:

    每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):

    -1:我选出的数字比你猜的数字小 pick < num 1:我选出的数字比你猜的数字大 pick > num 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num 返回我选出的数字。

    二、思路分析


    • 看看题目的示例,我们来理一理这个思路~

    • 示例 1:

      输入:n = 10, pick = 6
      输出:6
      
    • 示例2:

      输入:n = 1, pick = 1
      输出:1
      
    • 示例3:

    • 输入:n = 2, pick = 1
      输出:1
      
    • 示例4:

    • 输入:n = 2, pick = 2
      输出:2
      
    • 重点是这个,不要被迷惑了!

      • -1 : 我的数字比较小
      • 1 : 我的数字比较大
      • 0 : 恭喜!你猜对了!
    • 这个-1 指的是真实的结果比较小,换个说法就是你猜的结果大,不是你猜的小!不要被误导!

    三、AC 代码


    • 二分法YYDS!

      public class Solution extends GuessGame{
          public int guessNumber(int n){
              int low=1,high=n;
              while(low<=high){
                  //防止mid越界爆掉, /2 
                  int mid=low+(high-low)/2;
                  //调用guess
                  int res=guess(mid);
                  if(res!=0){
                      if(res==-1){
                          high=mid-1;
                      }else {
                          low=mid+1;
                      }
                  }else{
                      return mid;
                  }
              }
              return 0;
          }
      }
      
    • 执行结果:

    • image-20211107202431610.png

    • 做完之后我又去找了找其他大神们的解法,发现基本上都是使用二分法来解决的,不过他们写的更加简洁明了!

    • 个人感觉这题就是表达很让人误解,其实最终的目的是让我们尽量少调用 guess方法来找到分割点。

    • 还有就是mid的值,不要越界!可以通过 /2 或者直接使用long来接收!


路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah