任务是编写一个读取数字并将其存储到双端队列的程序。
样本输入为: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。 即不正确。
为什么以不同的方式输入相同的容量会得到不同的结果?
答案 0 :(得分:2)
这与您如何通过容量没有太大关系。它与循环内调用Scanner.nextInt
的次数有关。
因为总有5个输入,并且第一个输入始终是大小
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt())
sc.nextInt
总共将被调用5次(因为您有5个输入),在循环内被调用4次,在上一行中被调用1次,因此会将4个数字添加到双端队列。这是正确的。
但是,如果您这样做:
Deque<Integer> deque = new ArrayDeque<>(4)
sc.nextInt
将在循环内被调用5次,因此会将5个数字添加到双端队列。但是实际上不应将第一个数字添加到双端队列中,因为它是大小,因此会产生错误的输出。
ArrayDeque
的大小可调整,因此您实际上无需指定大小,代码仍然可以使用。
您可以通过在循环之前调用sc.nextInt
来忽略第一个输入:
sc.nextInt();
while (sc.hasNextInt()) {
...