有一个特异性的双端队列,,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据。现在要求移除数据的顺序为1到n。为了满足最后输出的要求,小A可以在任何时候调整队列中数据的顺序。请问 小A 最少需要调整几次才能够满足移除数据的顺序正好是1到n;输入:第一行一个数据n,表示数据的范围。接下来的2n行,其中有n行为添加数据,指令为:另外 n 行为移出数据指令,指令为:“remove” 的形式,表示移出1个数据;1 ≤ n ≤ 3 * 10^5。所有的数据均合法。输出:一个整数,表示 小A 要调整的最小次数。用java输出
时间: 2024-02-13 17:04:30 浏览: 87
以下是Java代码:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = i + 1;
}
Deque<Integer> deque = new LinkedList<>();
int count = 0;
for (int i = 0; i < 2 * n; i++) {
String op = scanner.next();
if (op.equals("addFirst")) {
deque.addFirst(scanner.nextInt());
} else if (op.equals("addLast")) {
deque.addLast(scanner.nextInt());
} else {
int num = deque.pollFirst();
if (num != nums[count]) {
int index = deque.size();
while (index >= 0) {
int cur = deque.pollLast();
if (cur == nums[count]) {
deque.addFirst(cur);
break;
} else {
deque.addFirst(cur);
index--;
}
}
}
count++;
}
}
System.out.println(count);
}
}
```
思路解析:
我们可以先将1到n的数存储在一个数组中,然后模拟添加数据和移出数据的过程。每次移出数据时,判断队列的头部元素是否是当前需要移出的数字,如果是则直接弹出;否则,我们需要将队列中不是当前需要移出的数字的元素重新排序,使得需要移出的数字位于队列的头部,然后再弹出。这个过程中,我们可以使用双端队列来存储数据,然后根据需要重新调整队列中元素的顺序。最终,我们需要输出调整队列顺序的最小次数。
阅读全文