刷 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
156會員
59內容數
本專題主要放一些投資理財方面的個人研究,投資理念偏向價值投資,習慣從產業的角度、產品營收佔比分析公司體質,近期研究的主題著重於: (1)半導體產業鏈:IC設計、IC製造、CoWos (2)重電產業鏈:台電強韌電網、智慧電網計畫 (3)營建股追蹤:隆大、新美齊、憶聲、順達、名軒
留言1
avatar-img
留言分享你的想法!

































































EMO先生的沙龍 的其他內容
台積電股價屢創新高,投資人常因定錨效應猶豫是否進場。本文分析台積電2024年第四季法說會內容,探討其營收成長、毛利率展望及未來資本支出,並說明先進製程佈局及AI需求,最終從不同角度評估台積電股價是否過高。
本文探討部署私有LLM的優缺點,並針對硬體、軟體、資料三個面向提供建議。文中比較三種顯卡:NVIDIA RTX 5090、RTX 4090和A6000,分析其優劣勢及適用場景,最後針對不同預算和需求的用戶提供選購建議。
隆大建設於2024年房市表現分析,探討其先建後售策略在央行第七波房市管制政策下所面臨的挑戰與機遇。文章分析高雄房市基本面,包含臺積電、輝達投資帶來的剛性需求,以及政策對投資型買盤的抑制。並深入探討隆大建設的財務狀況、銷售策略與未來展望,提醒投資者需關注其銷售狀況及市場接受度。
《藍色監獄》是一部以足球為主題的熱血漫畫,改編為動畫後廣受關注。本文深入探討動畫第二季的亮點,包括主角潔世一在追求勝利的過程中體現的勇於突破的人生觀,以及系師兄弟之間愛恨交織的戲劇化關係。此外,文章也點出動畫製作方面存在的不足,並建議讀者可直接觀看漫畫以獲得更佳的視覺體驗。
在選擇工作時,不僅要關注薪水的高低,還要考量工作環境和自身技能的匹配程度。文章探討了知識、技能和環境對於職業選擇的重要性,並強調了稀缺性和成長性的工作對於未來職涯發展的影響。這篇文章旨在幫助求職者從多方面思考,做出更明智的職業選擇。
企業開始利用AI Agent 來解決實際問題。Palantir 的 AIP 平臺展示瞭如何整合生成式 AI 和大規模語言模型,以提升企業的流程優化。透過客製化戰情中心、工作流程排程器及語意搜尋等功能,AIP 能有效助力企業提升生產力並改善管理效率。未來,AI 將在各行各業中扮演更加關鍵的角色。
台積電股價屢創新高,投資人常因定錨效應猶豫是否進場。本文分析台積電2024年第四季法說會內容,探討其營收成長、毛利率展望及未來資本支出,並說明先進製程佈局及AI需求,最終從不同角度評估台積電股價是否過高。
本文探討部署私有LLM的優缺點,並針對硬體、軟體、資料三個面向提供建議。文中比較三種顯卡:NVIDIA RTX 5090、RTX 4090和A6000,分析其優劣勢及適用場景,最後針對不同預算和需求的用戶提供選購建議。
隆大建設於2024年房市表現分析,探討其先建後售策略在央行第七波房市管制政策下所面臨的挑戰與機遇。文章分析高雄房市基本面,包含臺積電、輝達投資帶來的剛性需求,以及政策對投資型買盤的抑制。並深入探討隆大建設的財務狀況、銷售策略與未來展望,提醒投資者需關注其銷售狀況及市場接受度。
《藍色監獄》是一部以足球為主題的熱血漫畫,改編為動畫後廣受關注。本文深入探討動畫第二季的亮點,包括主角潔世一在追求勝利的過程中體現的勇於突破的人生觀,以及系師兄弟之間愛恨交織的戲劇化關係。此外,文章也點出動畫製作方面存在的不足,並建議讀者可直接觀看漫畫以獲得更佳的視覺體驗。
在選擇工作時,不僅要關注薪水的高低,還要考量工作環境和自身技能的匹配程度。文章探討了知識、技能和環境對於職業選擇的重要性,並強調了稀缺性和成長性的工作對於未來職涯發展的影響。這篇文章旨在幫助求職者從多方面思考,做出更明智的職業選擇。
企業開始利用AI Agent 來解決實際問題。Palantir 的 AIP 平臺展示瞭如何整合生成式 AI 和大規模語言模型,以提升企業的流程優化。透過客製化戰情中心、工作流程排程器及語意搜尋等功能,AIP 能有效助力企業提升生產力並改善管理效率。未來,AI 將在各行各業中扮演更加關鍵的角色。
你可能也想看
Google News 追蹤
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
探討如何使用DP動態規劃的方法來進行單字串接,包含了DP遞迴關係式、狀態定義、優化技巧和程式碼示例。同時分析了時間複雜度、空間複雜度和關鍵知識點。這是LeetCode的一個應用題,類似於Word Break I的延伸。
Thumbnail
知道如何從一組給定的英文字母和單字庫中的單字拼出最高分的單字組合。使用DFS + 回溯法 + 剪枝優化的演算法,詳細分析瞭如何展開所有可能的路徑,並且找出符合條件的狀態,協助讀者理解演算法背後的思維和方法。
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
題目已經給了依照起點升序排列好的區間陣列。 接下來新插入一個區間,插入後如果和原本的區間重疊,請把他們合併,要求我們輸出插入後的結果。 這是一個線性掃苗,所需時間為O(n)的演算法。 題目已經幫我們排序好區間順序,我們只要接著依序檢查區間、(假如有重疊的話)合併區間。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
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
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
探討如何使用DP動態規劃的方法來進行單字串接,包含了DP遞迴關係式、狀態定義、優化技巧和程式碼示例。同時分析了時間複雜度、空間複雜度和關鍵知識點。這是LeetCode的一個應用題,類似於Word Break I的延伸。
Thumbnail
知道如何從一組給定的英文字母和單字庫中的單字拼出最高分的單字組合。使用DFS + 回溯法 + 剪枝優化的演算法,詳細分析瞭如何展開所有可能的路徑,並且找出符合條件的狀態,協助讀者理解演算法背後的思維和方法。
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
題目已經給了依照起點升序排列好的區間陣列。 接下來新插入一個區間,插入後如果和原本的區間重疊,請把他們合併,要求我們輸出插入後的結果。 這是一個線性掃苗,所需時間為O(n)的演算法。 題目已經幫我們排序好區間順序,我們只要接著依序檢查區間、(假如有重疊的話)合併區間。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
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
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,