[374]Guess Number Higher or Lower

本文介绍了一种通过二分搜索解决猜数字游戏的方法。玩家需要从1到n中猜出预设的数字,每次猜测都会得到反馈:数字偏高、偏低还是正确。文章详细解释了如何使用二分搜索算法来高效地找到正确答案。

【题目描述】

We are playing the Guess Game. The game is as follows:

I pick a number from 1 to n. You have to guess which number I picked.

Every time you guess wrong, I'll tell you whether the number is higher or lower.

You call a pre-defined API guess(int num) which returns 3 possible results (-11, or 0):

-1 : My number is lower
 1 : My number is higher
 0 : Congrats! You got it!

Example:

n = 10, I pick 6.

【解题思路】

二分搜索

【代码】

// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);

class Solution {
public:
    int guessNumber(int n) {
        int low=1;
        int high=n;
        int mid;
        int ans=-1;
        while(1){
            mid=(high-low)/2+low;
            if(guess(mid)==0){
                ans=mid;
                break;
            }
            else if(guess(mid)==1){
                low=mid+1;
            }
            else if(guess(mid)==-1){
                high=mid-1;
            }
            
        }
        return ans;
    }
};


### 实验名称 二分查找猜数字游戏实验 ### 实验目的 通过编写使用二分查找算法实现的猜数字游戏,深入理解二分查找算法的原理和应用,掌握 Java 语言编程技巧,提高调试程序的能力,增强对程序设计整体思路的把握,将所学知识融会贯通。 ### 实验要求 编写一个猜数字的游戏,由计算机随机产生一个 1 - 100 之间的数字,用户进行猜测。使用二分查找算法,程序要提示用户猜大了、猜小了,直到用户猜中为止。 ### 实验环境 - 软件:JDK、IntelliJ IDEA ### 实验代码 ```java import java.util.Scanner; public class BinarySearchGuessGame { public static void main(String[] args) { int number = (int) (Math.random() * 100) + 1; int left = 1; int right = 100; Scanner sc = new Scanner(System.in); System.out.println("欢迎进入猜数字游戏,数字范围是 1 - 100。"); while (true) { int mid = left + (right - left) / 2; System.out.println("当前猜测范围是 " + left + " - " + right + ",请输入你猜的数字:"); int guess = sc.nextInt(); if (guess < number) { System.out.println("猜小了"); left = guess + 1; } else if (guess > number) { System.out.println("猜大了"); right = guess - 1; } else { System.out.println("恭喜你,猜对了!"); break; } } sc.close(); } } ``` ### 代码解释 1. 首先,程序随机生成一个 1 - 100 之间的数字 `number`。 2. 初始化左右边界 `left` 为 1,`right` 为 100。 3. 在循环中,计算中间值 `mid`,提示用户输入猜测的数字。 4. 如果用户猜的数字小于 `number`,则更新左边界 `left` 为 `guess + 1`,表示猜测范围缩小到右半部分。 5. 如果用户猜的数字大于 `number`,则更新右边界 `right` 为 `guess - 1`,表示猜测范围缩小到左半部分。 6. 如果用户猜对了,输出恭喜信息并结束循环。 ### 复杂度分析 - **时间复杂度**:$O(log n)$,其中 $n$ 是猜测范围的大小(这里是 100)。因为每次猜测后,猜测范围都会缩小一半,类似于二分查找的过程。 - **空间复杂度**:$O(1)$,只使用了常数级的额外空间。 ### 实验结果 对该程序进行多次测试,程序能够正确提示用户猜大了或猜小了,直到用户猜中为止。例如,当随机数字为 50 时,用户依次猜测 25、75、50,程序会依次提示猜小了、猜大了、猜对了。 ### 实验总结 本次实验成功实现了使用二分查找算法的猜数字游戏。通过实验,深入理解了二分查找算法的原理和应用,掌握了 Java 语言中随机数生成、输入输出处理和循环控制等编程技巧。二分查找算法在处理有序数据的查找问题时具有较高的效率,能够显著减少查找次数。 ### 改进建议 1. 可以增加游戏次数统计功能,记录用户猜对所需的次数。 2. 可以添加游戏难度选择,例如改变猜测范围的大小。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值