二分查找

算法提示:使用二分查找

描述。 根据来自guess_bot的响应,在一个范围内返回秘密的整数。

你会得到一个低和高的范围(包括)和一个GuessBot(guess_bot)的实例。

你只能通过它的方法与guess_bot互动:guess_number(num),它返回一个字符串。

guess_bot有点混蛋,当你调用guess_number(number)时只返回以下字符串。

更小':你的猜测太大 '大':你的猜测太小了 '正确':你的猜测是正确的 ‘你失败了,超过了尝试的机

聋子吗?如果你在已经猜到正确的数字后继续调用guess_number,则返回。 在机器人开始说你失败之前,你只有log2(N)次调用guess_number。N是[低,高]范围内可能的整数的数量。


1 <= N <= 10^14

low <= high

提示:使用二进制搜索

算法 "一个强大的头脑不会关注障碍,而是关注最终的回报。"

   ━━━━━ -♬- ━━━━━

编写Guess_Bot类比较大小并返回英文提示


import random
class Guess_Bot:
    def __init__(self, lower_bound: int, upper_bound: int, target: int):
        from math import log2
        self.lower_bound = lower_bound
        self.upper_bound = upper_bound
        self.target = target
        self.max_tries = log2(upper_bound - lower_bound + 1)
        self.tries_num = 0
        self.already_correct = False

    def guess_number(self, num: int):
        self.tries_num += 1
        if self.already_correct:
            return "What are you, deaf?"
        if self.tries_num >= self.max_tries:
            return "You failed due to exceed bigO"
        if num > self.target:
            return "Smaller"
        elif num < self.target:
            return "Larger"
        elif num == self.target:
            self.already_correct = True
            return "Correct"

主函数调用类Guess_Bot.guess_number 二分法猜中随机生成的变量target的值需要的次数。


def find_secret_number(low, high, guess_bot):
    step = 0
    while low <= high:
        mid = (low + high) // 2
        step += 1
        guess = guess_bot.guess_number(mid)

        if guess == 'Correct':
            return mid,step
        elif guess == 'Larger':
            low = mid
        elif guess == 'Smaller':
            high = mid

传入参数并执行


low, high = 1,100
target = random.choices([i for i in range(low,high,1)])[0]
print('target = ',target)
guess_bot = Guess_Bot(low, high, target)

测试一

1-100之内随机生成 85 为秘密数字,共需要6步猜中

target =  85
1 100 50 Larger 85
50 100 75 Larger 85
75 100 87 Smaller 85
75 87 81 Larger 85
81 87 84 Larger 85
84 87 85 Correct 85
(85, 6)

测试二

1-1000以随机生成 970为例,猜中需要9步


low, high = 1,1000
target = random.choices([i for i in range(low,high,1)])[0]
print('target = ',target)
guess_bot = Guess_Bot(low, high, target)

target =  790
1 1000 500 Larger 790
500 1000 750 Larger 790
750 1000 875 Smaller 790
750 875 812 Smaller 790
750 812 781 Larger 790
781 812 796 Smaller 790
781 796 788 Larger 790
788 796 792 Smaller 790
788 792 790 Correct 790
(790, 9)

测试三

1-100,000以随机生成 4309为例,猜中需要16步

low, high = 1,100000
target = random.choices([i for i in range(low,high,1)])[0]
print('target = ',target)
guess_bot = Guess_Bot(low, high, target)

target =  4309
1 100000 50000 Smaller 4309
1 50000 25000 Smaller 4309
1 25000 12500 Smaller 4309
1 12500 6250 Smaller 4309
1 6250 3125 Larger 4309
3125 6250 4687 Smaller 4309
3125 4687 3906 Larger 4309
3906 4687 4296 Larger 4309
4296 4687 4491 Smaller 4309
4296 4491 4393 Smaller 4309
4296 4393 4344 Smaller 4309
4296 4344 4320 Smaller 4309
4296 4320 4308 Larger 4309
4308 4320 4314 Smaller 4309
4308 4314 4311 Smaller 4309
4308 4311 4309 Correct 4309
(4309, 16)

本文由 mdnice 多平台发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值