pseudoyu

pseudoyu

Blockchain | Programming | Photography | Boyi
github
twitter
telegram
mastodon
bilibili
jike

LeetCode 刷題常用資料結構(Go 篇)

前言#

最近重新開始用 Go 刷 LeetCode 算法題,針對工作需求的算法刷題其實主要是鍛鍊解決問題的思路和程式碼撰寫能力,而不是像算法競賽那樣用複雜的資料結構,所以常用的資料結構和操作並不多,熟練使用也能很好地提升自己的程式碼品質,特此做一個整理,以便於查閱。

資料結構#

陣列#

初始化#

// 初始化一個大小為10,預設值為0的陣列
nums := make([10]int)

// 初始化一個二維布林陣列
visited := make([5][10]int)

常用方法#

for i := 0; i < len(nums); i++ {
    // 訪問num[i]
}

字串 String#

初始化#

s1 := "hello world"

// 創建多行字串
s2 := `This is a
multiline
string.`

訪問字串#

// 可直接用索引訪問位元組(非字元)
s1 := "hello world"
first := s[0]

s2 := []byte(s1)
first := s2[0]

修改字串#

// 字串的值是不可變的,可以分配一個新字串值
s := "hello"
t := s

// 將字串轉為[]byte或[]rune可以進行修改
s1 := "hello world"
s2 := []byte(s1)
s2[0] = 'H'
s3 := string(s2)

查詢字元是否屬於特定字元集#

    // 判斷字串s的i索引位置字元是否是元音
    if strings.Contains("aeiouAEIOU", string(s[i])) {
        // ...
    }

判斷字串大小#

if s1 == s2 {
    // 相等
} else {
    // 不相等
}

// Compare 函數可以用於比較,1大於,0相等,-1小於
// EqualFold 函數忽略大小寫後比較

拼接字串#

// 支援直接用+進行連接,但是效率不高
s1 := "hello "
s2 := s1 + "world"

高效拼接字串#

// bytes.Buffer可以一次性連接
var b bytes.Buffer
b.WriteString("Hello ")
b.WriteString("World")
b1 := b.String()

// 多個字串拼接
var strs []string
strings.Join(strs, "World")

整型 (或任意資料型別) 轉為字串#

// Itoa轉換
i := 123
t := strconv.Itoa(i)

// Sprintf轉換
i := 123
t := fmt.Sprintf("%d", i)

切片 slice#

初始化#

// 初始化一個存儲String型別的切片
slice := make([]string, 0)
slice := []string

// 初始化一個存儲int型別的切片
slice := make([]int, 0)
slice := []int

常用方法#

// 判斷是否為空
if len(slice) == 0 {
    // 為空
}

// 返回元素個數
len()

// 訪問索引元素
slice[i]

// 在尾部添加元素
slice = append(slice, 1)

通過切片模擬堆疊和佇列#

堆疊#

// 創建堆疊
stack := make([]int, 0)
// push壓入
stack = append(stack, 10)
// pop彈出
v := stack[len(stack) - 1]
stack = stack[:len(stack) - 1]
// 檢查堆疊是否為空
len(stack) == 0

佇列#

// 創建佇列
queue := make([]int, 0)
// enqueue入佇列
queue = append(queue, 10)
// dequeue出佇列
v := queue[0]
queue = queue[1:]
// 長度0為空
len(queue) == 0

Map#


// 創建
m := make(map[string]int)
// 設置kv
m["hello"] = 1
// 刪除k
delete(m,"hello")
// 遍歷
for k, v := range m{
    // 操作
}

// map鍵需要可比較,不能為slice、map、function
// map值都有預設值,可以直接操作預設值,如:m[age]++ 值由0變為1
// 比較兩個map需要遍歷,其中的kv是否相同,因為有預設值關係,所以需要檢查val和ok兩個值

標準庫#

sort#

// int排序
sort.Ints([]int{})
// 字串排序
sort.Strings([]string{})

math#

// int32 最大最小值
math.MaxInt32
math.MinInt32
// int64 最大最小值(int預設是int64)
math.MaxInt64
math.MinInt64

copy#

// 刪除a[i],可以用 copy 將i+1到末尾的值覆蓋到i,然後末尾-1
copy(a[i:], a[i+1:])
a = a[:len(a)-1]

// make創建長度,則通過索引賦值
a := make([]int, n)
a[n] = x

// make長度為0,則通過append()賦值
a := make([]int, 0)
a = append(a, x)

型別轉換#

// byte轉數字
s = "12345"  // s[0] 型別是byte
num := int(s[0] - '0') // 1
str := string(s[0]) // "1"
b := byte(num + '0') // '1'
fmt.Printf("%d%s%c\n", num, str, b) // 111

// 字串轉數字
num, _ := strconv.Atoi()
str := strconv.Itoa()

總結#

刷題路漫漫... 加油!

參考資料#

  1. LeetCode 官網
  2. greyireland/algorithm-pattern
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。