3604、猜数字大小

时间:2023-02-14 13:59:41

猜数字游戏的规则如下:


每轮游戏,我都会从 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 <= 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

));

}

}