nakamura244 blog

所属団体とは関係なく、個人的なblog

Dynamic Array : 配列へのappendでちょっとハマったのでメモ (panic: runtime error: index out of range)

はじめに

www.hackerrank.com

この問題を解いている時にハマったのでメモしとく

1次回答

上記の課題に対する回答で最初下記のように書いていた

func dynamicArray(n int32, queries [][]int32) []int32 {

    var ret []int32
    var lastAns int32 = 0

    s := make([][]int32, len(queries))

    for _, q := range queries {
        qType := q[0]
        x := q[1]
        y := q[2]

        index := (x ^ lastAns) % n

        if qType == 1 {
            s[index] = append(s[index], y)
        }

        if qType == 2 {
            elIndex := y % int32(len(s[index]))
            lastAns = s[index][elIndex]
            ret = append(ret, lastAns)
        }
    }
    return ret
}

これでsubmitするとコケるテストケースが存在したerrorは下記

panic: runtime error: index out of range [recovered]
        panic: runtime error: index out of range

s[index] = append(s[index], y)の所でエラーを出すテストケースが存在する様子

んでtest caseデータを実際にダウンロード(2.1M もあった!!)して手元で試した

s := make([][]int32, len(queries))に考慮が足りていなかった事に気づいた

2次回答

問題を色々と読んでいると配列の要素にappendしたくなるんだが、s["xxx"] = []int32{}のような形で格納しても問題ない事に気づいた。

そうすれば最初にsの長さとか計算しなくても良い。というかsの長さを最初に計算できるのか自分には不明だった😰

計算できるとより早く動くと思うんだけど...

最終回答

func dynamicArray(n int32, queries [][]int32) []int32 {
    
    var ret []int32
    var lastAns int32 = 0
    var s map[string][]int32 = map[string][]int32{}

    for _, q := range queries {
        qType := q[0]
        x := q[1]
        y := q[2]

        index := (x ^ lastAns) % n
        strIndex := strconv.Itoa(int(index))

        if qType == 1 {
            s[strIndex] = append(s[strIndex], y)
        }

        if qType == 2 {
            elIndex := y % int32(len(s[strIndex]))
            lastAns = s[strIndex][elIndex]
            ret = append(ret, lastAns)
        }
    }
    return ret

これでとりあえず全テストケースがクリアできた😃

予想以上に時間を費やしてしまったのでついでにblogに書いておいた

最後

  • 思っても見ない所でハマるもんだなぁ
  • 英語で問題の内容を理解する事に一番時間を使っている気がする😰😰