循环在一次运行中运行两次

时间:2018-01-16 20:57:40

标签: java arrays loops arraylist while-loop

此问题来自https://www.hackerrank.com/,其链接为https://www.hackerrank.com/challenges/java-list/problem。 在下面的代码中while循环运行两次,根据问题我们需要输入Q,Q乘以在Array Declared中执行的操作。为此,我运行两次循环,以便我可以得到所需的结果。

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) + " ");
        }
    }
}

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

2 个答案:

答案 0 :(得分:0)

因此,通过评论中的讨论,您已经说过您的问题是:

  

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

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

进入while循环后,系统会提示您输入s的值(您似乎打算使用&#34;插入&#34;或&#34;删除&#34;)。但是,第一次,它将获得一个空字符串,s将是&#34; \ n&#34;。为什么?因为对于N,L和Q,用户将输入如下值:

[value] [ENTER]

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

因为s不是&#34;插入&#34;或&#34;删除&#34;,它将在第一次跳过这些。然后,系统将提示您输入&#34; s&#34;的值。在下一个循环开始之后。

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

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

答案 1 :(得分:-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);
}