CodeSprout程式萌芽
困難第 369 題 · 分類狀態日誌
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Python

官方解答|分類狀態日誌

官方解答

Python #369:分類狀態日誌

解題規則

感測紀錄依名稱規則分類,每一組都維護自己的數值狀態與更新日誌。

依原順序讀 records,以「原始 name」作為字典鍵;各鍵有獨立狀態,第一次出現初值0。每筆使用 value 執行「把該筆value絕對值加到狀態」。位置與索引仍以整份 records 計算。每次留下 [分組鍵,更新前狀態,更新後狀態]。回傳 [依輸入順序的歷史,依鍵排序的 [鍵,最終狀態] 清單]。

處理步驟

各鍵初值為 0;每次由 groups 取出該鍵的 before,依整份輸入的原索引更新,寫回並保存歷史。

為何正確

每個鍵值或紀錄都按指定規則處理;篩選、轉換、分組或讀值各自使用規定的來源。排序只作用於題目要求的輸出,原字典與組內紀錄順序保持不變。

邊界與注意事項

本題輸入範圍:最多12筆;name 長度0~20;value 為 -100~100;指定鍵均存在,name 可以重複。 除題目指定的篩選或移除外,保留原資料的重複項與順序;使用切片或明確判斷安全處理允許的空資料。

範例追蹤

依參數順序 records 傳入 [[{"name":"B","value":3,"active":false},{"name":"Ada","value":-2,"active":true},{"name":"B","value":7,"active":true}]]。關鍵中間資料為 groups = {'B': 10, 'Ada': 2};history = [['B', 0, 3], ['Ada', 0, 2], ['B', 3, 10]];values = [3, -2, 7];index = 2。最後回傳 [[['B', 0, 3], ['Ada', 0, 2], ['B', 3, 10]], [['Ada', 2], ['B', 10]]]。結果由 return 回傳,不使用 print。

複雜度

設項目數 n、最大鍵長 L;逐筆處理加上輸出排序最壞時間 O(nL log n),保存分組、歷史和結果最壞需要 O(nL) 空間。

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

def solve(records):
    groups = {}
    history = []
    values = [row['value'] for row in records]
    for index, row in enumerate(records):
        name, value, active = row['name'], row['value'], row['active']
        key = name
        before = groups.get(key, 0)
        after = before + abs(value)
        groups[key] = after
        history.append([key, before, after])
    return [history, [[key, groups[key]] for key in sorted(groups)]]

留言討論 0