Dynamic Array : 配列へのappendでちょっとハマったのでメモ (panic: runtime error: index out of range)
はじめに
この問題を解いている時にハマったのでメモしとく
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に書いておいた
最後
- 思っても見ない所でハマるもんだなぁ
- 英語で問題の内容を理解する事に一番時間を使っている気がする😰😰