官方解答|狀態停機日誌
官方解答
Python #235:狀態停機日誌
解題規則
模擬器每次先更新讀值狀態,再檢查是否停機,請保存完整的檢查紀錄。
狀態初值0,使用 while 按原順序逐格執行「把原值加到狀態」。每次更新後檢查「更新後狀態小於當格原值」,成立就結束處理,但本次已更新的格子仍要記錄。每筆紀錄為 [原索引, 更新前狀態, 更新後狀態, 是否停止]。回傳 [全部紀錄, 尚未讀取的剩餘清單]。空輸入回傳 [[],[]]。
處理步驟
保存 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 < values[index]
history.append([index, before, state, stopped])
index += 1
if stopped:
break
return [history, values[index:]]
留言討論 0
登入 後就能留言,一起討論不同的寫法。