【学習記録】GoでTwo Sum問題を解く

しばらくPythonDjango REST frameworkの勉強に集中していたので、今日は気分転換にLeetCodeの問題をGoで解く練習をしました。
いろんな記事を見ながらコードを書いていって、なんとか想定通りに動きました。

LeetCodeのこちらの問題を解きました。

leetcode.com

問題内容は以下。

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order.

int型の配列とターゲットの二つを引数として受け取り、配列の中からターゲットと同じ数値になる組み合わせを返す。
各インプットで一つの解答が想定される。
同じ要素は2度使わない。
返り値の並び順はどんな並びでも良いとのこと。

調べながら書いたコードは以下になります。

func twoSum(nums []int, target int) []int {
    for i, num := range nums {
        for j, next := range nums[i+1:] {
            j += i + 1
            if num+next == target {
                return []int{i, j}
            }
        }
    }
    return []int{}
}

アルゴリズムの組み立て方もすごく勉強になりましたが、その他にGoの文法で学びがあったのは以下。

  • nums[i+1:]と書くことで、配列numsのi+1以降の要素に対しforループを回すことができる

  • int型のスライスを返すときは[]int{}と書く

上記のtowSum関数を呼び出すmain関数は以下のように書きました。

func main() {
    s := []int{1, 2, 3}
    result := twoSum(s, 5)
    fmt.Println(result) // [1, 2]が出力される
}

動作確認 f:id:JunpeiNakasone:20210321142430p:plain

雑感

こういうアルゴリズム系の問題を解くのはダイレクトにプログラミングスキルを鍛えれる実感があり面白いですね。
AWSの勉強とか各プログラミング言語フレームワークの勉強とアルゴリズムの勉強を良い感じにバランスとって、地道に競技プログラミングとかもやっていきたいと思います。