【问题标题】:Checking array for unique digits and looping back检查数组的唯一数字并循环返回
【发布时间】:2012-01-08 10:02:50
【问题描述】:

我目前正在尝试编写一个程序,该程序要求用户输入一个三位数字,并根据计算机生成的随机 3 位数字对其进行检查。用户输入的号码必须具有三个唯一数字,因为计算机号码也具有三个唯一数字。 到目前为止,我已经设法将用户的三位数字放入一个数组中,每个数组位置都有一个数字,但我无法正确验证它。它能够识别两个相同的数字,因此它需要向用户询问具有 3 个不同数字的新数字(即循环回到开头),直到用户遵守。 System.out.println 只是让我检查它是否选择了两位数。到目前为止,这是我的代码。这是一个方法,而不是整个程序。

public static int[] getUserNumberDebugMode(String compNum){
    final int RANDOM_NUMBER_SIZE = 3;
    int[]userNumber = new int [RANDOM_NUMBER_SIZE];

    String userGuessAsString;

    userGuessAsString = JOptionPane.showInputDialog(compNum + "\n Please enter a number.");
    int number = Integer.parseInt(userGuessAsString);

    // put three digit number individually into array
    for(int loop = (userNumber.length - 1); loop>=0; loop--){
        userNumber[loop]= number%10;
        number = number/10;
    } // end userNumber array populating

    for (int outerloop = 0; outerloop < userNumber.length; outerloop++){
        for (int innerloop = outerloop - 1; innerloop > -1; innerloop --){
            while (userNumber[outerloop] == userNumber [innerloop]){
            System.out.println("user compare: " + outerloop + " with: " + innerloop);
            } // end while loop
        }// end inner loop
    } // end outer loop

    return userNumber;
} // end getUserNumberDebugMode

【问题讨论】:

  • 这很难阅读,也很难理解您的要求。究竟是什么不工作?你看到了什么与你期望什么?你已经尝试过什么?
  • 当它发现两个数字相同时,它正在无限循环。例如,如果用户输入 323,它应该要求用户输入一个具有唯一数字的数字,例如 326,然后将这些数字放入一个数组中并再次检查。
  • 我已经解决了这个问题,但不能在稍后发布我的解决方案。感谢您的所有帮助。

标签: java arrays validation loops


【解决方案1】:

已经解决了这个问题,方法是检查唯一编号是否匹配,然后在唯一编号检查 > 0 时将整个事情放在一个 do/while 循环中。我敢肯定,这不是最优雅的修复,但它有效,它会做。

do{
        uniqueCheck = 0;
        userGuessAsString = JOptionPane.showInputDialog(compNum + "\n Please enter a number.");
    int number = Integer.parseInt(userGuessAsString);

    // put three digit number individually into array
    for(int loop = (userNumber.length - 1); loop>=0; loop--){
        userNumber[loop]= number%10;
        number = number/10;
    } // end userNumber array populating

    for (int loop = 0; loop < userNumber.length; loop++){
        for(int innerLoop  = 0; innerLoop < userNumber.length; innerLoop++) {
            if(loop != innerLoop) {
                if (userNumber[loop] == userNumber[innerLoop] ){
                    JOptionPane.showMessageDialog(null, "Please enter three unique digits!", "ERROR", JOptionPane.ERROR_MESSAGE);
                    uniqueCheck ++;
                } //  end inner IF loop
            } // end outer IF loop
        } // end inner for loop
    } // end outer for loop

    } while (uniqueCheck > 0);

【讨论】:

    【解决方案2】:

    我没有通过该程序,因为它对于您想要实现的目标看起来有点复杂。为确保用户输入的数字具有 3 个唯一数字,请尝试以下算法:

    1. 拆分用户输入的字符串中的字符。
    2. 将每个字符转换为整数并放入集合中。
    3. 将其添加到 Set 时,请确保 set.add() 返回 true。
    4. 如果不是,则数字不是唯一的,您可以抛出错误并再次从用户那里获取数据。
    5. 否则继续与计算机生成的数字进行比较。

    简单得多,而不是循环。

    【讨论】:

    • +1 用于提及集合——绝对是检查唯一性的正确数据结构。
    【解决方案3】:

    好吧,你可能不想要那个最里面的“while”循环,因为一旦你得到一个匹配的值,它就会永远运行。

    但是,关于您的外循环和内循环值,您第一次检查 userNumber 时,outerloop 将是 0innerloop 将是 -1。可能不是你想要的。为了使您的循环逻辑正确,只需逐步执行每一行代码,确定每个变量在每个步骤中的含义(或在调试器中执行此操作)。这应该可以帮助您纠正逻辑。

    【讨论】:

      【解决方案4】:

      作为家庭作业帮助,我建议您以错误的方式看待这个问题。请记住,方法中的错误可能会导致您陷入三重嵌套循环和 O(n^2) 或更糟的情况,当 O(n) 解决方案可用时。

      听起来您不是在寻找 3 位数字,而是在寻找 3 位数字 - 这些是非常不同的东西 - 如果顺序无关紧要,那么让这个事实对您有用。如果您只是在寻找 X 位数字并在第一个数字之后验证每个数字的出现次数不超过 N 次(这里 N=0),那么您选择了错误的东西来制作数组。

      您应该能够在没有嵌套循环的情况下执行此操作。如果你小心,我相信你应该能够只用一个循环来做到这一点(假设数组初始化为正常的东西,或者你可以检查单元格是否被初始化)。如果您稍微聪明一点,您可能可以让您的解决方案在下一个问题中正常工作,涉及 10 个唯一数字,或者数字出现不超过 3 次,或者扩展到包含字母。

      换个说法,你是在做冒泡排序吗?要确定之前是否已经看到位置 Y 的值,您是否遍历位置 0 到 Y-1?然后你是否通过从 0 到 Y 在位置 Y+1 重复该操作?

      【讨论】:

      • 它需要在一个数组中,以便可以根据计算机编号检查位置匹配的数字和三位数内但位置不正确的数字,例如。 326 与 367 相比会给出一个“靶心”,即 3,和一个“命中”,即 6。我已经完成了,只是没有用户验证。首先,用户必须一次输入一个数字,但规范规定用户需要能够一次输入一个 3 位数字。
      • 好的,我没有考虑 Mastermind 的实现。对于这类问题的最佳解决方案已经有相当多的关注,但是对于这样的事情,我仍然会说你正在查看错误的数组 - 不要使用存储数字的位置数组,使用数组存储位置的数字。 (不熟悉Mastermind的,直接搜索“Mastermind game”即可)
      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多