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

官方解答|訊號狀態日誌

官方解答

Python #499:訊號狀態日誌

解題規則

模擬器依序收到正負讀值變動,請追蹤接受與拒絕紀錄以及當時狀態。

Tracker 保存 initial、value、accepted、rejected、history。value初值為initial,兩個計數初值0,history初值空清單。按原順序處理changes,索引從0開始。接受規則:「每筆都接受」。接受時把value改成「直接改成 amount」並將accepted加1;拒絕時value不變、rejected加1。無論接受或拒絕,都在該步結束時記錄value。最後回傳每個事件處理後的value清單;拒絕事件也記錄未變的值。

處理步驟

apply 先用更新前 value 判斷接受與否。接受時更新 value、accepted,拒絕時只增加 rejected;兩種情況都保存該步 value。最後依 report 規則整理屬性。

為何正確

物件屬性保存當前狀態;負責更新的方法依當時屬性完成一次更新與必要的快照,讀值步驟只讀取目前屬性。初始化及逐次更新維持題目指定的狀態,因此最後回傳的資料符合指定摘要。

邊界與注意事項

本題輸入範圍:initial 為 -10~10;changes 長度0~8,每個數為 -6~6。索引從0開始,每一步必須使用當時狀態。 除題目指定的篩選或移除外,保留原資料的重複項與順序;使用切片或明確判斷安全處理允許的空資料。 需要清單快照時另外複製,兩個物件的清單與計數彼此獨立。

範例追蹤

依參數順序 initial, changes 傳入 [4,[0,-2,0,3]]。關鍵中間資料為 tracker = {'initial': 4, 'value': 3, 'accepted': 4, 'rejected': 0, 'history': [0, -2, 0, 3]};index = 3;amount = 3。最後回傳 [0, -2, 0, 3]。結果由 return 回傳,不使用 print。

複雜度

設輸入及必要輸出的總大小為 n;複製、轉換或掃描最壞時間 O(n),保存中間資料與回傳結果最壞需要 O(n) 空間。

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

class Tracker:

    def __init__(self, initial):
        self.initial = initial
        self.value = initial
        self.accepted = 0
        self.rejected = 0
        self.history = []

    def apply(self, amount, index):
        if True:
            self.value = amount
            self.accepted += 1
        else:
            self.rejected += 1
        self.history.append(self.value)

    def report(self):
        return list(self.history)

def solve(initial, changes):
    tracker = Tracker(initial)
    for (index, amount) in enumerate(changes):
        tracker.apply(amount, index)
    return tracker.report()

留言討論 0