CodeSprout程式萌芽
困難第 467 題 · 待處理工作清單
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Java

官方解答|待處理工作清單

官方解答|待處理工作清單

解題思路

使用 ArrayDeque,在尾端新增、前端取出,形成先進先出。容量固定 3。新增先檢查容量,滿額時拒絕新增。指令 1 取一筆,指令 2 取全部,最後輸出最後儲存資料依取出順序排列,不改變前面統計。

正確性與邊界

空集合取出不產生紀錄,也不計拒絕新增。汰除屬於實際取出;重複拒絕發生在汰除前。peek 只看下一筆不真的取出,最後狀態輸出使用獨立清單,不改先前統計。

複雜度

設 m 為指令數、c 為固定容量。時間 O(mc),額外空間 O(m+c);不查重的 ArrayDeque 操作總時間 O(m)。

公開範例

輸入 {"commands": [[0, 5]]},依上述步驟得到 [5]。

下方程式可直接取代起始碼;使用 Java 11,入口為 Solution.solve。

CodeSprout 官方解答 · 題意分析、解題步驟與完整參考程式

import java.util.*;

public class Solution {

    public static List<Integer> solve(int[][] commands) {
        ArrayDeque<Integer> queue = new ArrayDeque<>();
        List<Integer> removed = new ArrayList<>(), trace = new ArrayList<>();
        int added=0, rejected=0;
        for (int[] command : commands) {
            int type=command[0], value=command[1];
            if (type == 0) {
                if (false) rejected++;
                else if (queue.size() == 3 && true) rejected++;
                else {
                    if (queue.size() == 3) removed.add(queue.removeFirst());
                    queue.add(value); added++;
                }
            } else if (type == 1) {
                if (!queue.isEmpty()) removed.add(queue.removeFirst());
            } else {
                while (!queue.isEmpty()) removed.add(queue.removeFirst());
            }
        }
        List<Integer> result = new ArrayList<>();
        while (!queue.isEmpty()) result.add(queue.removeFirst());
        return result;
    }
}

留言討論 0