Leetcode Note: Go - Find All Numbers Disappeared in an Array
Find All Numbers Disappeared in an Array - LeetCode
https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/
- Go 言語で取り組んだメモ
所感
- int 配列の nums を受け取り、スキップされている数値を推測して int 配列で return する
回答
golang solution beats 99% runtime - LeetCode Discuss
https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/discuss/790951/golang-solution-beats-99-runtime
func findDisappearedNumbers(nums []int) []int {
length := len(nums)
if length == 0 {
return nil
}
res := make([]int, length)
for _, v := range nums {
res[v-1] = v
}
j := 0
for i := 0; i < length; i++ {
if res[i] == 0 {
res[j] = i + 1
j++
}
}
return res[:j]
}
- 一度目の for ループで res に数列を準備
- 昇順にソートされており nums に含まれていない数値の箇所は value が 0 となる
[4,3,2,7,8,2,3,1]
という input なら[1 2 3 4 0 0 7 8]
という res が出来上がる- 同じ数値が複数個あっても冪等で素晴らしい実装だ・・・
- 二度目の for ループで res を return するための整形
- value が 0 の項目を算出して、それらを配列の先頭に移動
[1 2 3 4 0 0 7 8]
なら[5 6 3 4 0 0 7 8]
という res に整形される
- 整形した res の先頭を return して終了
return res[:j]
配列を return する要件の場合、なんとなく配列を新規作成するアプローチを前提にしてしまっていたが、配列を使いまわして先頭や最後尾部分だけを return するような実装も有りだし、ソッチのほうがメモリ効率も良くて学びになった