Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
題目描述 給定一個按照非遞減順序排列的整數陣列 nums,請你原地刪除重複出現的元素,使每個元素只出現一次。元素的相對順序應該保持一致。然後返回 nums 中唯一元素的個數。
假設 nums 的唯一元素個數為 k,為了通過測試,你需要做以下事情:
更改陣列 nums,使 nums 的前 k 個元素包含原來的唯一元素,且順序與原陣列相同 nums 的其餘元素以及 nums 的大小都不重要 什麼是非遞減順序? 在深入解題之前,先理解一個重要概念:
非遞減順序是指陣列中的每個元素都不小於前一個元素。簡單來說,就是「排序好的陣列,但允許有重複值」。
# ✅ 非遞減順序的例子 [1, 2, 3, 4, 5] # 嚴格遞增 [1, 1, 2, 2, 3] # 有重複值(這題的重點!) [5, 5, 5, 5, 5] # 全部相同 [1, 2, 2, 3, 3, 3] # 部分重複 # ❌ 不是非遞減順序 [5, 4, 3, 2, 1] # 遞減 [1, 3, 2, 4] # 有下降視覺化理解 非遞減順序(像爬樓梯,可以有平地): ┌─────┐ ┌─┤ │ ┌─┤ │ │ ─┤ │ │ │ └─┴─┴─────┘ 1 2 2 3 3 關鍵:因為是非遞減順序,相同的元素必定相鄰!範例 範例 1:
Queue(佇列)資料結構完整教學 什麼是 Queue? Queue(佇列)是一種遵循 FIFO(First In First Out,先進先出) 原則的線性資料結構。就像現實生活中的排隊一樣,第一個進入佇列的元素會第一個離開。
視覺化概念 排隊買票的例子: [出口] ← 小明 ← 小華 ← 小美 ← [入口] ↑ ↑ 先到的人 後到的人 (先離開) (後離開) 資料結構表示: Front [10 | 20 | 30 | 40] Rear 出隊 ← ← 入隊Queue 的基本操作 Enqueue(入隊):在佇列尾端加入元素 Dequeue(出隊):從佇列前端移除元素 Front/Peek:查看佇列前端元素(不移除) IsEmpty:檢查佇列是否為空 Size:取得佇列中的元素數量 為什麼需要 Queue? 實際應用場景 # 1. 印表機工作佇列 print_queue = Queue() print_queue.enqueue("文件1.pdf") print_queue.enqueue("報告.docx") print_queue.enqueue("圖片.jpg") # 按照順序列印 # 2. 作業系統的程序排程 process_queue = Queue() process_queue.enqueue("Process A") process_queue.enqueue("Process B") # CPU 按順序處理 # 3.
前言
在現代程式設計中,我們習慣於直接使用各種語言的文字,從英文到中文,從表情符號到特殊符號。但在電腦發展的早期,如何讓電腦「理解」和儲存人類的文字,卻是一個巨大的挑戰。今天,讓我們一起回顧字符編碼的發展歷程。
題目描述 給定兩個已排序的鏈結串列 list1 和 list2 的頭節點。
將這兩個串列合併成一個已排序的串列。合併後的串列應該透過拼接前兩個串列的節點來建立。
返回合併後鏈結串列的頭節點。
範例 範例 1:
輸入:list1 = [1,2,4], list2 = [1,3,4] 輸出:[1,1,2,3,4,4]範例 2:
輸入:list1 = [], list2 = [] 輸出:[]範例 3:
輸入:list1 = [], list2 = [0] 輸出:[0]限制條件 兩個串列的節點數量範圍為 [0, 50] -100 <= Node.val <= 100 list1 和 list2 都按照非遞減順序排列 解題思路 這道題目要求我們合併兩個已排序的鏈結串列。主要有兩種解法:
方法一:迭代法 使用雙指標的概念,逐一比較兩個串列的當前節點,將較小的節點加入結果串列。
核心概念:
建立一個虛擬頭節點(dummy node)來簡化邊界條件處理 使用一個指標追蹤結果串列的當前位置 比較兩個串列的當前節點,選擇較小的加入結果 處理剩餘的節點 方法二:遞迴法 利用遞迴的特性,每次選擇較小的節點,然後遞迴處理剩餘部分。
核心概念:
基本情況:如果其中一個串列為空,返回另一個串列 比較兩個串列的頭節點 選擇較小的節點,並遞迴處理剩餘部分 程式碼實現 方法一:迭代法 # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next=None): self.
Linked List(鏈結串列)完整教學 什麼是 Linked List? Linked List(鏈結串列)是一種線性的資料結構,其中的元素不是儲存在連續的記憶體位置,而是透過指標(pointer)相互連接。每個元素稱為節點(Node),包含兩個部分:
資料(Data):儲存實際的值 指標(Next):指向下一個節點的參考 視覺化表示 [Data|Next] -> [Data|Next] -> [Data|Next] -> None ↑ ↑ ↑ Node 1 Node 2 Node 3為什麼需要 Linked List? 與 Python List(Array)的比較 # Python List(動態陣列) python_list = [1, 2, 3, 4, 5] # 記憶體中連續存放:[1][2][3][4][5] # Linked List # 記憶體中分散存放: # [1|→] -----> [2|→] -----> [3|→] -----> [4|→] -----> [5|None]優缺點比較 操作 Python List Linked List 訪問第 i 個元素 O(1) O(n) 在開頭插入 O(n) O(1) 在結尾插入 O(1)* O(n) 在中間插入 O(n) O(1)** 刪除元素 O(n) O(1)** 記憶體使用 連續 分散 * 平均情況,可能需要擴容 ** 如果已經有該位置的參考
前言
BFS(Breadth-First Search,廣度優先搜尋)和 DFS(Depth-First Search,深度優先搜尋)是圖論和樹結構中最基礎也最重要的兩個演算法。幾乎所有的圖和樹相關問題都會用到這兩種遍歷方式。
本文將從基礎概念開始,逐步深入到實際應用,幫助你徹底掌握這兩個演算法。