CodeSprout程式萌芽
中等第 455 題 · 樣本快照盒
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Python

官方解答|樣本快照盒

官方解答

Python #455:樣本快照盒

解題規則

樣本盒連續更新目前的樣本清單,請分別保存不受後續更新影響的快照。

ListSession 複製輸入清單保存為 values。先執行「將目前清單反向」,再針對更新後清單執行「在尾端加入原本目前清單的總和,空清單加入0」。每步完成後都保存一份新的清單副本到 history,避免後一步改動前一步快照。回傳這兩個快照組成的清單。

處理步驟

初始化時複製輸入,兩個 edit 依序操作當時的 values;每次另用 list(values) 保存快照,避免後續改動影響之前結果。

為何正確

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

邊界與注意事項

本題輸入範圍:長度0~12,每個數為 -100~100。物件須自行複製輸入清單,不修改呼叫者的原始清單。 除題目指定的篩選或移除外,保留原資料的重複項與順序;使用切片或明確判斷安全處理允許的空資料。 需要清單快照時另外複製,兩個物件的清單與計數彼此獨立。

範例追蹤

依參數順序 values 傳入 [[3,-2,0,5,-2]]。關鍵中間資料為 box = {'values': [-2, 5, 0, -2, 3, 4], 'history': [[-2, 5, 0, -2, 3], [-2, 5, 0, -2, 3, 4]]}。最後回傳 [[-2, 5, 0, -2, 3], [-2, 5, 0, -2, 3, 4]]。結果由 return 回傳,不使用 print。

複雜度

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

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

class ListSession:

    def __init__(self, values):
        self.values = list(values)
        self.history = []

    def first_edit(self):
        self.values = self.values[::-1]
        self.history.append(list(self.values))

    def second_edit(self):
        self.values = self.values + [sum(self.values)]
        self.history.append(list(self.values))

    def report(self):
        return [list(values) for values in self.history]

def solve(values):
    box = ListSession(values)
    box.first_edit()
    box.second_edit()
    return box.report()

留言討論 0