CodeSprout程式萌芽
困難第 225 題 · 訊號分段日誌
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Python

官方解答|訊號分段日誌

官方解答

Python #225:訊號分段日誌

解題規則

訊號串流含有分段標記,請將每段的數值狀態更新記錄分開保存。

用 while 逐格讀 values。每個符合「大於0的值」的格子都是分隔符:不計算該格,先存下目前片段,再開始空片段並把狀態重設為0。其餘格子會「把狀態改成狀態與原值的較大值」,把更新後狀態加到目前片段。結束時一定存入最後片段,保留所有空片段;因此空輸入回傳 [[]]。回傳各片段的狀態歷史清單。索引與第一個原始值都指未分段前的原輸入。

處理步驟

以 [[]] 初始化片段;每個分隔項新增一段並重設 state;普通項更新當段狀態。連續分隔和首尾分隔形成的空片段也保留。

為何正確

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

邊界與注意事項

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

範例追蹤

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

複雜度

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

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

def solve(values):
    segments = [[]]
    state = 0
    index = 0
    while index < len(values):
        if values[index] > 0:
            segments.append([])
            state = 0
        else:
            state = max(state, values[index])
            segments[-1].append(state)
        index += 1
    return segments

留言討論 0