java - 根据用户输入在 1 到 100 范围内执行二分搜索

标签 java search binary

我正在运行一个二分搜索程序,该程序接受用户输入的字符“l”表示低值,“h”表示高值,如果值正确则输入“c”。我的第一个方法返回字符 我的中点方法仅读取第一个字符输入。如果我从 50 开始并按“h”,中点会正确上升到 75,但我无法让程序读取“l”并将值再次降低到 50。该程序仅读取用户输入的第一个字符,但我需要更新答案中的值。是我的 while 循环错误还是我的决策语句错误?谢谢。

import java.util.Scanner;

public class PlayGuessingGame {
    public static char getUserresponseGuess(){  
        Scanner scan = new Scanner(System.in);
        char guesses = scan.next().charAt(0); 
        System.out.println("this is the user input " + guesses);
        return(guesses);
    }   

    public static int getMidpoint(int low, int high){ 
        int middle;
        //the midpoint is high + low divided by 2
        middle = (low + high)/ 2;

        System.out.println("is it " + middle);
        char answer =  getUserresponseGuess();

        System.out.println("this is the answer " + answer);

        //char get_input = getUserresponseGuess();
        //System.out.println("this is the output "+ get_input);
        while(low <= high){
            if(answer == 'h'){
                low = middle + 1; 
                System.out.println("this is low " + low);
                middle = (low + high)/2; 

                char new_answer = getUserresponseGuess();
                middle = (low + high)/2;
                System.out.println("is it" + middle);
                getUserresponseGuess();
            }
            //the number presented to the user is is too high, the midpoint is high -1
            else if(answer == 'l'){
                System.out.println("we're in the low portion");
                high = middle - 1;
                middle = (low + high) /2;
                System.out.print("is it " + middle);
                middle = (low + high) /2;
            }
            if(answer == 'c'){
                System.out.println("congrats!");
            }
            return(middle);
        }
        return(-1); 
    }

    public static void main(String[] args){         
        getMidpoint(1,100);
    }
}

最佳答案

你这里有一些错误。我会尽力回答每一个问题,但我可能会错过一些问题,如果我错过了一个,请突出显示一些。 让我们看看这个只有注释的循环,以使其更具可读性

while(low <= high){
    if(answer == 'h'){
        //calculate higher
        //ask input #####
        //calculate higher
        //ask input #####
    } else if(answer == 'l'){
        //calculate lower
    }
    if(answer == 'c'){
        //Congrats
    }
    //end method
}

评估

首先,您在 if(answer == 'h') 中执行了太多操作。您正在计算两次中间,中间有一个新的输入询问。不应该这样做。

这个想法是在每个循环中要求用户输入一次

是否循环?

由于循环中有一个 return 语句,没有任何条件,因此无论如何都会执行它。所以你的循环只执行一次(这并不是真正的循环)。以下语句将简单地停止循环并退出该方法:

return(middle);

我相信这应该是在前面的条件下,只有当用户输入正确时才停止该方法:

if(answer == 'c'){
     System.out.println("congrats!");
     return(middle);
}

切换

你可以使用 switch 来代替这 3 个条件,这样会更干净,

if (answer == 'h')
else if (answer == 'l')
else if (answer == 'c')

所以上面的条件可以写成

switch(answer){
    case 'h':

        break;
    case 'l':

        break;
    case 'c':

        break;
    default:

}

获取输入

您需要获取每个循环的输入,因此在循环开始时(就在 while 行之后)执行此操作会更容易。更好的是,直接在开关中,因为稍后您实际上不需要输入,例如:

switch(getUserresponseGuess()){
    ...
}

扫描仪

嗯,您不应该每次都创建一个新的 Scanner 实例,您在读取值的方法中所做的事情:

public static char getUserresponseGuess(){  
    Scanner scan = new Scanner(System.in);
    char guesses = scan.next().charAt(0); 
    System.out.println("this is the user input " + guesses);
    return(guesses);
}   

设置扫描全局实例并实例化一次,这样可以降低数据泄露的风险。

private static Scanner scan = new Scanner(System.in);
public static char getUserresponseGuess(){  
    ....
}

关于java - 根据用户输入在 1 到 100 范围内执行二分搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42342370/

相关文章:

java - 你有像这个 url 站点 http ://www. zhoyosoft.com 这样的 Flash 或 flex 或 jQuery 标题动画吗?

api - Solr 可以加载原始 Lucene 索引吗?

Ruby float 到 Binary32

C++ 文件 (exe) 读取自身

java - 使用抽象类方法

Java获取文本文件的属性

Java 类加载器更改

c# - 查找所选单元格的相似连接邻居以形成集群

正则表达式:匹配至少两个搜索词

python - 二进制到字符串,比字典好?