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