CodeSprout程式萌芽
中等第 459 題 · 雙步狀態盒
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Python

官方解答|雙步狀態盒

官方解答

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