pseudoyu

pseudoyu

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

LeetCode 刷题常用データ構造(Go 篇)

前言#

最近、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()

結論#

問題を解く道は長いです... 頑張ってください!

参考資料#

  1. LeetCode 公式ウェブサイト
  2. greyireland/algorithm-pattern
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。