透過簡單的 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會當成類似初始化的步驟。
- 因為 slice , map , ch 是引用型別 Reference Types ,預設不是 0 而是
for _ , v := range nums- 這是
go針對內建五種可迭代資料型態(切片(Slice)、陣列(Array)、地圖(Map)、字串(String)、通道(Channel)。 剛剛有提過),提供一個語法糖(就是讓開發者可以寫得比較方便的語法這樣),也就是forrange語法 - 這個意思就是
for i,v := range nums從nums開始走訪元素,然後把 索引( 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 的方法手動轉換。