官方解答|雙步狀態盒
官方解答
Python #459:雙步狀態盒
解題規則
模擬器會用同一個變動欄位連續更新狀態兩次,請保存兩個階段的讀值。
用 first 建立 TwoStepCounter,value 初值為 first,history 初值為空清單。兩次方法都傳入 second 作為 amount。先執行 first_step:將 value 改成「目前 value 加上 amount」;再用更新後狀態執行 second_step:將 value 改成「目前 value 與 amount 的差距絕對值」。每次更新後都將 value 加入 history。report 回傳兩次更新後數值的清單。
處理步驟
兩個方法都收到相同 amount。first_step 先更新 value 並保存快照,second_step 以更新後 value 再更新並保存;report 依題目附上或略去淨變動。
為何正確
物件屬性保存當前狀態;負責更新的方法依當時屬性完成一次更新與必要的快照,讀值步驟只讀取目前屬性。初始化及逐次更新維持題目指定的狀態,因此最後回傳的資料符合指定摘要。
邊界與注意事項
本題輸入範圍:兩數皆為 -100~100;如題目提到份數、除數或長度,會明確以 abs(...)+1 轉為正數。 除題目指定的篩選或移除外,保留原資料的重複項與順序;使用切片或明確判斷安全處理允許的空資料。 Python // 是向下取整;% 與它配對滿足被除數 = 商×除數 + 餘數,負數仍遵循此規則。 需要清單快照時另外複製,兩個物件的清單與計數彼此獨立。
範例追蹤
依參數順序 first, second 傳入 [-9,0]。關鍵中間資料為 counter = {'initial': -9, 'value': 9, 'history': [-9, 9]}。最後回傳 [-9, 9]。結果由 return 回傳,不使用 print。
複雜度
依本題有界的數字、日期範圍,執行固定次數運算,時間與額外空間為 O(1)。
CodeSprout 官方解答 · 題意分析、解題步驟與完整參考程式
class TwoStepCounter:
def __init__(self, initial):
self.initial = initial
self.value = initial
self.history = []
def first_step(self, amount):
self.value = self.value + amount
self.history.append(self.value)
def second_step(self, amount):
self.value = abs(self.value - amount)
self.history.append(self.value)
def report(self):
return list(self.history)
def solve(first, second):
counter = TwoStepCounter(first)
counter.first_step(second)
counter.second_step(second)
return counter.report()
留言討論 0
登入 後就能留言,一起討論不同的寫法。