CodeSprout程式萌芽
困難第 293 題 · 訊號狀態報表
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Python

官方解答|訊號狀態報表

官方解答

Python #293:訊號狀態報表

解題規則

記錄器以共用工具逐筆更新狀態,最後由摘要工具整理整段歷史。

update(state,x,index,first_value) 的規則是「把原值加到狀態」;first_value 是整份輸入的第一格,空時為0,index 是原索引。從狀態0開始逐格呼叫 update,保留每次更新後數值。summarize(part) 回傳歷史清單的0的出現次數。最後回傳 [全部狀態歷史, 摘要結果]。兩個函式分別負責更新與統計。

處理步驟

狀態從 0 開始;每格傳入原索引與整份輸入的首值呼叫 update;最後由 summarize 處理全部更新後狀態。

為何正確

輔助函式只使用自己的參數,回傳該規則的結果;solve 按規定順序傳入原值或前一步結果。因此每次函式呼叫都完成其指定工作,組合結果也符合題目。

邊界與注意事項

本題輸入範圍:清單長度 0~12;每個值為 -100~100 的整數。

範例追蹤

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

複雜度

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

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

def update(state, x, index, first_value):
    return state + x

def summarize(part):
    return part.count(0)

def solve(values):
    state = 0
    history = []
    first_value = values[0] if values else 0
    for (index, x) in enumerate(values):
        state = update(state, x, index, first_value)
        history.append(state)
    return [history, summarize(history)]

留言討論 0