前言#
最近、Go を使って LeetCode のアルゴリズム問題を解くことを再開しました。仕事の要件に基づいたアルゴリズム問題の解決方法やコーディング能力を鍛えることが主な目的であり、アルゴリズム競技のように複雑なデータ構造を使用するわけではありません。そのため、よく使用されるデータ構造と操作は多くありませんが、それらを熟練に使用することで自分のコードの品質を向上させることができます。そのため、整理して参照しやすくするためにまとめてみました。
データ構造#
配列#
初期化#
// サイズ10で初期値0の配列を初期化
nums := make([10]int)
// 2次元のブール値配列を初期化
visited := make([5][10]int)
よく使用されるメソッド#
for i := 0; i < len(nums); i++ {
// num[i]にアクセス
}
文字列#
初期化#
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 := 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
マップ#
// 作成する
m := make(map[string]int)
// キーと値を設定する
m["hello"] = 1
// キーを削除する
delete(m,"hello")
// 繰り返し処理する
for k, v := range m{
// 操作する
}
// マップのキーは比較可能である必要があり、スライス、マップ、関数にすることはできません
// マップの値にはデフォルト値があり、デフォルト値を直接操作することができます。例:m[age]++ 値が0から1に変わります
// 2つのマップを比較するには、キーと値のペアが同じかどうかをチェックする必要があります。デフォルト値の関係で、valとokの2つの値をチェックする必要があります
標準ライブラリ#
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
// 長さが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()
結論#
問題を解く道は長いです... 頑張ってください!