【问题标题】:The loop runs twice in a single run循环在一次运行中运行两次
【发布时间】:2018-06-25 15:52:14
【问题描述】:

这个问题来自https://www.hackerrank.com/,链接是https://www.hackerrank.com/challenges/java-list/problem。 在下面的代码中,while 循环运行了两次,根据问题我们需要输入 Q,Q 次操作要在声明的数组中执行。为此,我运行了两次循环,以便获得所需的结果。

import java.util.*;

public class javaList {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int i, x;
        ArrayList L = new ArrayList(N);
        for (i = 0; i < N; i++) {
            L.add(sc.nextInt());
        }
        int Q = sc.nextInt();
        i = 0;
        // for normal running i have multiplied Q by 2 so that i can get the results
        while (i < Q * 2) {
            System.out.println("Loop: " + i);
            String s = sc.nextLine();
            int sz = L.size();
            // code for checking insert
            if (s.equals("Insert")) {
                x = sc.nextInt();
                int y = sc.nextInt();
                //if the position i am looking exists then just replace
                // i need to insert at index x of array L but array.size() gives one more than the last index
                if ((sz - 1) >= x) {
                    L.add(x, y);
                }
                //if the position i am looking does not exist then create
                else {
                    for (int j = sz; j <= x; j++) {
                        //add number to desired place
                        if (j == x)
                            L.add(y);
                            //in between the two endings of array and insertion adding default value 0
                        else
                            L.add(0);
                    }
                }
                //checking code for Delete
            } else if (s.equals("Delete")) {
                x = sc.nextInt();
                //if the desired location exists then only replace
                if ((sz - 1) >= x) {
                    L.remove(x);
                }
            }
            i++;
        }
        for (i = 0; i < L.size(); i++) {
            System.out.print(L.get(i) + " ");
        }
    }
}

我想知道为什么循环在一次运行中运行两次。

【问题讨论】:

  • 我看到代码中有多个循环。哪个运行了两次,您希望它运行多少次?
  • 对不起,先生,我会为特定任务制定方法。
  • While 循环。
  • while (i &lt; Q * 2) 将导致循环执行Q * 2 次。这是你想要的吗?
  • 对于这个问题,我这样做了。 while(i

标签: java arrays loops arraylist while-loop


【解决方案1】:

您的代码太复杂了。试试这个:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    List<Integer> list = new ArrayList<>();
    for (int i = 0, n = scanner.nextInt(); i < n; i++) {
        list.add(scanner.nextInt());
    }

    for (int i = 0, n = scanner.nextInt(); i < n; i++) {
        if (scanner.next().equals("Insert")) {
            list.add(scanner.nextInt(), scanner.nextInt());
        } else {
            list.remove(scanner.nextInt());
        }
    }

    String result = list.stream()
            .map(String::valueOf)
            .collect(Collectors.joining(" "));
    System.out.println(result);
}

【讨论】:

  • 很抱歉在阅读代码时出现问题。但是您的解决方案给出了错误。如果我声明 n=5 并想在索引 7 处插入。
【解决方案2】:

因此,从 cmets 的讨论中,您表示您的问题是:

如果 Q = 2 那么它应该在我的代码中询问操作插入或删除 4 次。但它只问了 2 次。这就是我的问题

首先,您可能不完全了解自己的程序流程。在while循环之前,需要输入三组值,N的值,L的值,Q的值。

一旦您进入 while 循环,系统将提示您输入 s 的值(您似乎打算将其设为“插入”或“删除”)。然而,第一次,它会得到一个空字符串,s 将是“\n”。为什么?因为对于 N、L 和 Q,用户将输入如下值:

[值] [ENTER]

返回键本身就是一个值。因此,在输入缓冲区中(假设 Q = 2),是“2\n”。当您的代码运行以获取 s String s = sc.nextLine(); 时,它将看到下一行符号并跳过提示用户输入。

因为 s 不是“插入”或“删除”,所以它会在第一次跳过这些。然后会在开始下一个循环后提示您输入“s”的值。

为了帮助您了解发生了什么,我建议在您要求用户输入值的任何地方添加语句,例如 System.out.println("Enter a value for Q:");

这将帮助您跟踪程序流程。

【讨论】:

  • 谢谢,我明白我错过了什么。但是,如果我不想打印任何东西,我该怎么办?正如你所说 System.out.println("输入 Q 的值:");我有很多问题被要求直接获取输入而不显示任何消息。
  • @MdMobshshirNayeem 一般来说,我建议在创建和测试程序时使用打印语句。一旦您确定它按预期工作,您可以在提交作业之前删除它们。在这种特殊情况下,您似乎需要一些提示 - 需要输入的不同值太多,并且特定输入或输入数量会根据其他值而变化。例如,如果我为 N 输入 1,我只需要在 Q 之前输入一个附加值。如果我为 N 输入 3,我将需要提供 3 个附加值。如果没有提示,这可能会令人困惑。
  • @MdMobshshirNayeem 另外,为了确保在循环中第一次提示用户输入 s,我建议在 int Q = sc.nextInt(); 之后添加一个 sc.next(); 这将消耗扫描仪中留下的任何令牌之后用户输入 Q 以便扫描仪为空,并在到达String s = sc.nextLine();时等待用户输入
  • 感谢所有的努力。我终于明白了解决方案。这个我以前学过,但从来没有遇到过,从今天开始我想我永远不会忘记这个概念。
  • @MdMobshshirNayeem 很高兴能帮上忙。我还想感谢您在发布完整且有效的代码示例方面做得很好。一旦我了解了您遇到的问题,我就很容易提供帮助。
最近更新 更多