285猜数字大小

Posted huoyingfans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了285猜数字大小相关的知识,希望对你有一定的参考价值。

猜数字游戏的规则如下:

每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。

如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。

你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-11 或 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 <= n <= 231 1

1 <= pick <= n

通过次数96,779提交次数186,333

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.isNumber;

/**

 * 374. 猜数字大小 猜数字游戏的规则如下:

 *

 * 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。 <br/>

 * 你可以通过调用一个预先定义好的接口 : int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0): <br/>

 *

 * -1:我选出的数字比你猜的数字小 pick < num 1:我选出的数字比你猜的数字大 pick > num 0:我选出的数字和你猜的数字一样。

 * 恭喜!你猜对了!pick == num 返回我选出的数字。 <br/>

 *

 * 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 *

 * @author wen.lei@brgroup.com

 *

 *         2022-2-19

 */

public class GuessNumberHigherOrLower

    private int pick;

    public GuessNumberHigherOrLower(int pick)

        this.pick = pick;

    

    /*  示例 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 <= n <= 231 - 1

    1 <= pick <= n*/

    // 0 1 2 3 4 5 6 7 8 9

    // 1 2 3 4

    /**

     * 数据源,本质是从0到n的一个数组。因为数字是连续的,不存在“二分查找”的一个“细节问题” TODO

     *

     * @param n

     * @return

     */

    public int guessNumber(int n)

        if (pick < 0 || pick > n)

            throw new IllegalArgumentException("pick<0 || pick >n");

        

        int result = 0;

        int min = 0;

        int max = n;

        int num = (min + max) / 2;

        while ((result = guess(num)) != 0 /*&& min < max*/)

            if (result == 1)

                min = num + 1;

             else if (result == -1)

                max = num - 1;

            

            // 越界了 num = (min + max) / 2;

            num = min + (max - min) / 2;

        

        /*        if (min >= max)

            return min;

        

        */ return num;

    

    /**

     * Forward declaration of guess API.

     *

     * @param num

     *            your guess

     * @return -1 if num is lower than the guess number 1 if num is higher than the guess number otherwise return 0 int

     *         guess(int num);

     */

    public int guess(int num)

        if (pick < num)

            return -1;

         else if (pick > num)

            return 1;

         else 

            return 0;

        

    

package test.leecode.isNumber;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.isNumber.GuessNumberHigherOrLower;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-21

 */

public class GuessNumberHigherOrLowerTest

    @Test

    public void test()

        GuessNumberHigherOrLower guess20 = new GuessNumberHigherOrLower(20);

        Assert.assertEquals(20,guess20.guessNumber(100));

        GuessNumberHigherOrLower guess1 = new GuessNumberHigherOrLower(1);

        Assert.assertEquals(1,guess1.guessNumber(100));

        GuessNumberHigherOrLower guess258 = new GuessNumberHigherOrLower(258);

        Assert.assertEquals(258,guess258.guessNumber(300));

        GuessNumberHigherOrLower guess69 = new GuessNumberHigherOrLower(69);

        Assert.assertEquals(69,guess69.guessNumber(100));

    

     

    @Test

    public void test2()

        GuessNumberHigherOrLower guess125689 = new GuessNumberHigherOrLower(1702766719);

        Assert.assertEquals(1702766719,guess125689.guessNumber(2126753390

            ));

    

以上是关于285猜数字大小的主要内容,如果未能解决你的问题,请参考以下文章

374. 猜数字大小

3604猜数字大小

《LeetCode之每日一题》:61.猜数字大小

LeetCode--374--猜数字大小

猜数字大小

374. 猜数字大小