任务是编写一个程序来读取数字并将它们存储到双端队列中。
样品输入为:4 1 2 3 4样品输出:4 2 1 3
应该添加偶数作为第一个元素,一个奇数 - 作为最后一个。之后,程序必须输出从第一个到最后一个的所有元素。
这是我的一段代码:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt());
while (sc.hasNext()) {
int nextInt = sc.nextInt();
if (nextInt % 2 == 0) {
deque.addFirst(nextInt);
} else deque.addLast(nextInt);
}
for (int elt : deque) {
System.out.println(elt);
}
}
}
样本输出:4 2 1 3
它工作正常,这是正确的。但!
我们改写吧
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt())
如
Deque<Integer> deque = new ArrayDeque<>(4)
对于这个,样本输出是:4 2 4 1 3。即它是不正确的。
为什么以不同的方式输入相同容量会产生不同的结果?
这与您传递容量的方式没有太大关系。它更多地与在循环内调用Scanner.nextInt
的次数有关。
因为总有5个输入,第一个输入总是大小,如果你这样做的话
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt())
sc.nextInt
将被调用5次(因为你有5个输入),4次循环内部和1次上面的行,所以4个数字将添加到Deque。这是对的。
如果你这样做了:
Deque<Integer> deque = new ArrayDeque<>(4)
sc.nextInt
将在循环内被调用5次,因此5个数字将被添加到Deque中。但实际上不应该将第一个数字添加到Deque,因为它是大小,因此产生错误的输出。
ArrayDeque
是可调整大小的,因此您实际上不需要指定大小,您的代码仍然可以工作。
您可以通过在循环之前调用sc.nextInt
来忽略第一个输入:
sc.nextInt();
while (sc.hasNextInt()) {
...