CodeSprout程式萌芽
困難第 223 題 · 狀態停機日誌
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Python

官方解答|狀態停機日誌

官方解答

Python #223:狀態停機日誌

解題規則

模擬器每次先更新讀值狀態,再檢查是否停機,請保存完整的檢查紀錄。

狀態初值0,使用 while 按原順序逐格執行「把原值加到狀態」。每次更新後檢查「更新後狀態等於0」,成立就結束處理,但本次已更新的格子仍要記錄。每筆紀錄為 [原索引, 更新前狀態, 更新後狀態, 是否停止]。回傳 [全部紀錄, 尚未讀取的剩餘清單]。空輸入回傳 [[],[]]。

處理步驟

保存 before,更新 state,再計算 stopped 並保存四欄紀錄;游標先前進一格,才依 stopped 決定是否停止。

為何正確

每次迴圈開始時,游標指向下一個尚未處理的位置,state 表示已處理資料的狀態。停止條件放在題目要求的更新前或更新後,游標與歷史就能正確區分已讀和未讀資料。

邊界與注意事項

本題輸入範圍:清單長度 0~12;每個值為 -100~100 的整數。 除題目指定的篩選或移除外,保留原資料的重複項與順序;使用切片或明確判斷安全處理允許的空資料。

範例追蹤

依參數順序 values 傳入 [[3,-2,0,5,-2]]。關鍵中間資料為 state = 4;history = [[0, 0, 3, False], [1, 3, 1, False], [2, 1, 1, False], [3, 1, 6, False], [4, 6, 4, False]];index = 5;before = 6。最後回傳 [[[0, 0, 3, False], [1, 3, 1, False], [2, 1, 1, False], [3, 1, 6, False], [4, 6, 4, False]], []]。結果由 return 回傳,不使用 print。

複雜度

設輸入總長度 n;游標或迴圈逐次前進,最壞時間 O(n),保存歷史與回傳結果最壞需要 O(n) 空間。

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

def solve(values):
    state = 0
    history = []
    index = 0
    while index < len(values):
        before = state
        state = state + values[index]
        stopped = state == 0
        history.append([index, before, state, stopped])
        index += 1
        if stopped:
            break
    return [history, values[index:]]

留言討論 0