官方解答|訊號狀態日誌
官方解答
Python #475:訊號狀態日誌
解題規則
模擬器依序收到正負讀值變動,請追蹤接受與拒絕紀錄以及當時狀態。
Tracker 保存 initial、value、accepted、rejected、history。value初值為initial,兩個計數初值0,history初值空清單。按原順序處理changes,索引從0開始。接受規則:「每筆都接受」。接受時把value改成「目前 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': 5, 'accepted': 4, 'rejected': 0, 'history': [4, 2, 2, 5]};index = 3;amount = 3。最後回傳 [4, 2, 2, 5]。結果由 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 = 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
登入 後就能留言,一起討論不同的寫法。