leetcode 374. 猜数字大小

170 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

猜数字游戏的规则如下:

每轮游戏,我都会从 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,然后进行while循环,然后在while循环中通过头尾相加除以2的方式获取两个变量的中间值,获取到中间值后进行判断是否是选中值,如果是则返回,如果不是则判断大于选中值还是小于选中值,如果大于选中值则说明选中值在头值和中间值之间,那么将尾值设为中间值-1然后继续循环,如果小于选中值,则说明选中值在中间值和尾值之间,那么将头值设为中间值+1然后继续循环,直到找到为止

var guessNumber = function(n) {
    let first = 1
    let end = n
    let mid = Math.floor((end+first)/2)
    while(mid){
        mid = Math.floor((end+first)/2)
        if(guess(mid)===0)return mid
        if(guess(mid)===1){
            first = mid+1
        }else{
            end = mid-1
        }
    }
};