seansie's blog

透過簡單的 leetcode 題目來學習 go 的基礎語法 #1

受眾

有基礎程式語法能力的,變數,分支,迴圈,函數等。

最後一個單字的長度

https://leetcode.com/problems/length-of-last-word/

func lengthOfLastWord(s string) int {
    tok := strings.Fields(s)
    return len(tok[len(tok)-1])
}

逐行解析

  • := 是宣告的語法, go 會自動推論 資料型態,這樣可以少寫一點,不過這種語法只能放在函數之外
  • strings.Fields() 輸入字串 輸出依照 空格切割的字串
  • len() 輸出長度,僅限於以下資料型態
    • 字串(string):傳回位元組(byte)長度。
    • 陣列(array):傳回陣列固定長度。
    • 切片(slice):傳回目前元素個數。映射(map):傳回鍵值對(key-value)數量。
    • 通道(channel):傳回目前通道緩衝區中未被讀取的元素個數。
    • 指標(指向陣列):若是指向陣列的指標,同樣支援

是否有重複

https://leetcode.com/problems/contains-duplicate/

func containsDuplicate(nums []int) bool {
    freq := make(map[int]int)
    for _ , v := range nums{
        freq[v] = freq[v]+1
    }
    for _ ,v := range freq{
        if v != 1 {
            return true;
        }
    }
    return false;

}

逐行解析

  • freq := make(map[int]int)
    • 這個 make 函數是 go 的資料結構的 工廠函數 他會回傳一個空的資料結構,除了 map 還有其他東西都可以
      • 切片 (Slices):配置底層陣列並回傳切片。
      • 映射 (Maps):初始化雜湊表結構。
      • 通道 (Channels):初始化並配置佇列緩衝區。
    • 為甚麼要用 make ?
      • 因為 slice , map , ch 是引用型別 Reference Types ,預設不是 0 而是 nil 如果不用 make 進行初始化會錯誤, make 會當成類似初始化的步驟。
    • for _ , v := range nums
      • 這是 go 針對內建五種可迭代資料型態(切片(Slice)、陣列(Array)、地圖(Map)、字串(String)、通道(Channel)。 剛剛有提過),提供一個語法糖(就是讓開發者可以寫得比較方便的語法這樣),也就是 for range 語法
      • 這個意思就是 for i,v := range numsnums 開始走訪元素,然後把 索引( index 因為這個例子用不到 所以用 _ 代表) 設為 i (慣例),然後元素數值設定為 v 然後重複執行直到走訪完所有元素。
      • freq[v] = freq[v]+1 就標準的 +1 寫法,運用了 go 的 map 的 int 初始化的時候數值為 0

242. Valid Anagram

https://leetcode.com/problems/valid-anagram/

func isAnagram(s string, t string) bool {
    if len(s) != len(t) {
        return false
    }
    sMap := make([]int, 26)
    tMap := make([]int, 26)
    for _, ch := range s {
        sMap[ch-'a']++
    }
    for _, ch := range t {
        tMap[ch-'a']++
    }
    for i := 0; i < 26; i++ {
        if sMap[i] != tMap[i] {
            return false
        }
    }
    return true
}

逐行解析

  • sMap := make([]int, 26)
    • slice 的 make 用法,記得最後要放切片的長度

反轉 ascii 的字串

https://leetcode.com/problems/reverse-string/

func reverseString(s []byte)  {
    slices.Reverse(s)
}

逐行解析

  • 就練習一下 go 的 builtin function

注意 : 這只有 ascii 的字串才能這樣搞, utf8 的要先轉換成 rune (就是 utf8 的字元 跟 ascii 不一樣),然後用 two pointer 的方法手動轉換。