刷 LeetCode 常用的 Golang 小技巧

更新於 發佈於 閱讀時間約 8 分鐘

LeetCode 是程式設計師鍛煉演算法能力的重要平台,而 Golang 作為高效的語言之一,在解題時需要靈活運用其特性和小技巧來提升效率。以下將介紹一些刷 LeetCode 時常用的 Golang 小技巧,並分析其效果與好處。


1. 使用 map[int]int 解決問題


在解題過程中,map[int]int 是一種非常實用的數據結構,特別是在需要快速查找元素或進行頻率統計時。雖然 Golang 中沒有內建的 set 結構,但我們可以使用 map[int]bool 模擬。


宣告與使用方法

// 宣告 map[int]int
counts := make(map[int]int)

// 插入與更新元素
counts[1]++
counts[2] += 3

// 查詢元素
if val, exists := counts[3]; exists {
fmt.Println("Value:", val)
}

// 刪除元素
delete(counts, 2)


效果

  • 時間複雜度: 查找、插入和刪除操作均為 O(1)。
  • 空間複雜度: 根據數據量動態分配內存。

好處

  • 高效性: 提供 O(1) 的查找與更新效率,適用於需頻繁操作的題目。
  • 靈活性: 支援多種操作,可用於統計頻率、記錄索引等場景。
  • 簡潔性: 語法簡單,易於理解和使用。


2. 使用 slice 實作堆疊(Stack)


Golang 中沒有內建的堆疊結構,因此我們需要透過 slice 來實作。這在處理深度優先搜尋(DFS)或括號匹配等問題中十分常見。


實作方法

// 初始化 stack
stack := []int{}

// Push 操作
stack = append(stack, 5) // 將元素 5 壓入堆疊

// Pop 操作
if len(stack) > 0 {
top := stack[len(stack)-1] // 取得堆疊頂部元素
stack = stack[:len(stack)-1] // 移除堆疊頂部元素
}

// Peek 操作
if len(stack) > 0 {
top := stack[len(stack)-1] // 取得堆疊頂部元素但不移除
}


效果

  • 時間複雜度: Push 和 Pop 操作均為 O(1)。
  • 空間複雜度: 根據使用需求動態分配內存。

好處

  • 模擬真實堆疊行為: 使用簡單語法實現經典的 LIFO(後進先出)邏輯。
  • 高效性: 利用 slice 的內存管理,無需額外實作數據結構。
  • 適配多樣場景: 適用於 DFS、括號檢查等需要堆疊操作的題目。


3. 使用 copy 高效複製切片


在處理需要拷貝切片的問題時,Golang 提供內建的 copy 函數,可以高效地完成此操作。

// 原始切片
original := []int{1, 2, 3, 4, 5}

// 創建新切片並拷貝
copySlice := make([]int, len(original))
copy(copySlice, original)

fmt.Println("Original:", original)
fmt.Println("Copy:", copySlice)


效果

  • 時間複雜度: 查找、插入和刪除操作均為 O(1)。
  • 空間複雜度: 根據數據量動態分配內存。

好處

  1. 高效性: 提供 O(1) 的查找與更新效率,適用於需頻繁操作的題目。
  2. 靈活性: 支援多種操作,可用於統計頻率、記錄索引等場景。
  3. 簡潔性: 語法簡單,易於理解和使用。


4. 使用 for 取代 while


Golang 沒有專門的 while 語法,但我們可以使用 for 模擬其行為,這在實現條件迴圈時非常實用。


// 使用 for 模擬 while
x := 0
for x < 5 {
fmt.Println(x)
x++
}


效果

  • 功能一致: for 可以模擬所有的 while 場景。
  • 語法統一: Golang 中只有一種迴圈語法,簡化了程式結構。

好處

  1. 簡潔統一: 避免學習和使用多種語法。
  2. 靈活性高: for 的條件控制可以完全覆蓋 while 的需求。


5. 處理鏈結串列(Linked List)的小技巧


在處理 Linked List 相關題目時,可以藉由畫圖幫助理解 Linked List 的行為 。

舉例來說若有List結構如 "prev -> first -> second -> Next",若需要交換first, second node,可透過以下操作。


定義與操作

type ListNode struct {
Val int
Next *ListNode
}

// 交換鏈結串列中成對的節點
func swapPairs(head *ListNode) *ListNode {
dummy := &ListNode{Next: head}
prev := dummy
for head != nil && head.Next != nil {
first := head
second := head.Next

// 交換節點
prev.Next = second
// prev -> second, first -> second -> Next

first.Next = second.Next
// prev -> second, first -> Next

second.Next = first
// prev -> second -> first -> Next

// 移動指針到下一對節點
prev = first
head = first.Next
}
return dummy.Next
}


重點解釋:交換 first 和 second 節點

prev.Next = second

  • 將 prev 的 Next 指向 second,即 prev.Next = second

目前狀態:prev -> second, first -> second -> Next。


first.Next = second.Next

  • 將 first 的 Next 指向 second 的 Next,即 first.Next = second.Next

目前狀態:prev -> second, first -> Next。


second.Next = first

  • 將 second 的 Next 指向 first,即 second.Next = first

目前狀態:prev -> second -> first -> Next。


結語


在使用 Golang 刷 LeetCode 時,掌握 map[int]intslice 堆疊、多重返回值、defercopy、變數交換(Swap)、鏈結串列操作以及使用 for 模擬 while 等技巧,能夠有效提升解題效率與程式可讀性。透過熟悉這些小技巧,我們可以更快速地解決問題,並從中學習到更多 Golang 的特性。


留言
avatar-img
留言分享你的想法!
黃璧怡-avatar-img
2025/01/28
祝EMO先生新年快樂!🧧🎊☀️
avatar-img
EMO先生的沙龍
158會員
66內容數
本專題主要放一些投資理財方面的個人研究,投資理念偏向價值投資,習慣從產業的角度、產品營收佔比分析公司體質,近期研究的主題著重於: (1)半導體產業鏈:IC設計、IC製造、CoWos (2)重電產業鏈:台電強韌電網、智慧電網計畫 (3)營建股追蹤:隆大、新美齊、憶聲、順達、名軒
EMO先生的沙龍的其他內容
2025/04/13
大型語言模型的發展,讓人們思考陪伴型機器人是否能成真,文章探討兩種實現方式:主流的語音轉文字LLM方法和新興的Spoken LLMs方法。作者認為Spoken LLMs的發展,能讓AI更自然地與人互動,實現如哆啦A夢般的陪伴型機器人,並進一步提升AI的陪伴功能。
Thumbnail
2025/04/13
大型語言模型的發展,讓人們思考陪伴型機器人是否能成真,文章探討兩種實現方式:主流的語音轉文字LLM方法和新興的Spoken LLMs方法。作者認為Spoken LLMs的發展,能讓AI更自然地與人互動,實現如哆啦A夢般的陪伴型機器人,並進一步提升AI的陪伴功能。
Thumbnail
2025/04/03
頻繁查詢資料庫造成效能瓶頸?本文探討讀寫分離架構,透過主從資料庫分擔讀寫負載,提升系統效能。並深入分析資料一致性、應用層路由、負載均衡及Redis快取等重要面向,提供解決方案及注意事項。
Thumbnail
2025/04/03
頻繁查詢資料庫造成效能瓶頸?本文探討讀寫分離架構,透過主從資料庫分擔讀寫負載,提升系統效能。並深入分析資料一致性、應用層路由、負載均衡及Redis快取等重要面向,提供解決方案及注意事項。
Thumbnail
2025/02/02
此文章介紹LeetCode中Binary Tree的三種主要遍歷方法:深度優先搜尋(DFS)、廣度優先搜尋(BFS)和中序遍歷(Inorder Traversal),並搭配LeetCode範例題目說明其應用與解題技巧。文末總結各種方法的適用情境,幫助讀者提升解題能力。
Thumbnail
2025/02/02
此文章介紹LeetCode中Binary Tree的三種主要遍歷方法:深度優先搜尋(DFS)、廣度優先搜尋(BFS)和中序遍歷(Inorder Traversal),並搭配LeetCode範例題目說明其應用與解題技巧。文末總結各種方法的適用情境,幫助讀者提升解題能力。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
此文章介紹LeetCode中Binary Tree的三種主要遍歷方法:深度優先搜尋(DFS)、廣度優先搜尋(BFS)和中序遍歷(Inorder Traversal),並搭配LeetCode範例題目說明其應用與解題技巧。文末總結各種方法的適用情境,幫助讀者提升解題能力。
Thumbnail
此文章介紹LeetCode中Binary Tree的三種主要遍歷方法:深度優先搜尋(DFS)、廣度優先搜尋(BFS)和中序遍歷(Inorder Traversal),並搭配LeetCode範例題目說明其應用與解題技巧。文末總結各種方法的適用情境,幫助讀者提升解題能力。
Thumbnail
本文介紹使用 Golang 解決 LeetCode 題目的技巧,包含運用 map[int]int、slice 實作堆疊、copy 函數高效複製切片、for 迴圈取代 while 迴圈,以及處理鏈結串列的技巧,以提升程式碼效率和可讀性。
Thumbnail
本文介紹使用 Golang 解決 LeetCode 題目的技巧,包含運用 map[int]int、slice 實作堆疊、copy 函數高效複製切片、for 迴圈取代 while 迴圈,以及處理鏈結串列的技巧,以提升程式碼效率和可讀性。
Thumbnail
題目敘述 題目會給我們一個字串s。 要求我們移除字串中的星號,還有刪除星號左手邊最靠近的第一個字元。 以字串的形式返回輸出答案。 題目的原文敘述 測試範例 Example 1: Input: s = "leet**cod*e" Output: "lecoe" Explanation:
Thumbnail
題目敘述 題目會給我們一個字串s。 要求我們移除字串中的星號,還有刪除星號左手邊最靠近的第一個字元。 以字串的形式返回輸出答案。 題目的原文敘述 測試範例 Example 1: Input: s = "leet**cod*e" Output: "lecoe" Explanation:
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
在 Kotlin 程式語言中,for 迴圈非常便捷,能用於遍歷陣列、列表、集合等多種資料型別中的元素。這種遍歷方式不僅簡潔易讀,還能輕鬆處理集合內的元素。
Thumbnail
在 Kotlin 程式語言中,for 迴圈非常便捷,能用於遍歷陣列、列表、集合等多種資料型別中的元素。這種遍歷方式不僅簡潔易讀,還能輕鬆處理集合內的元素。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
Thumbnail
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
Thumbnail
精通 Golang 正則表達式的代碼優化。透過高效的字符串處理、動態模式生成和編譯,以及處理複雜文本匹配,將正則表達式融入你的代碼中,提升效能。
Thumbnail
精通 Golang 正則表達式的代碼優化。透過高效的字符串處理、動態模式生成和編譯,以及處理複雜文本匹配,將正則表達式融入你的代碼中,提升效能。
Thumbnail
探索 Golang 正則表達式的進階技巧。理解貪婪和非貪婪匹配,運用惰性限定符優化效能,深入分組和非捕獲分組,並優化正則表達式的性能。
Thumbnail
探索 Golang 正則表達式的進階技巧。理解貪婪和非貪婪匹配,運用惰性限定符優化效能,深入分組和非捕獲分組,並優化正則表達式的性能。
Thumbnail
當我們需要重複一系列有規則的行為,例如從1加到100,或是取得物件裡面的每一個元素,例如將串列裡面的每個元素印出,重複地撰寫程式碼顯然不切實際,for迴圈便是可以讓程式對可迭代物件(iterable object)執行迭代(iteration)的工具。
Thumbnail
當我們需要重複一系列有規則的行為,例如從1加到100,或是取得物件裡面的每一個元素,例如將串列裡面的每個元素印出,重複地撰寫程式碼顯然不切實際,for迴圈便是可以讓程式對可迭代物件(iterable object)執行迭代(iteration)的工具。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News