diff --git a/pullrequests/single_number/step1.go b/pullrequests/single_number/step1.go new file mode 100644 index 0000000..b61f0be --- /dev/null +++ b/pullrequests/single_number/step1.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package singlenumber + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:3分 +LeetCodeには空間計算量がO(1)になるように実装しろと書かれていたが、方法が思いつかなかったので、まずは普通に実装してみた。 +*/ +func singleNumberStep1(nums []int) int { + singleNums := make(map[int]int, len(nums)) + for _, n := range nums { + singleNums[n]++ + if singleNums[n] > 1 { + delete(singleNums, n) + } + } + // 必要に応じてlen(singleNums) != 1のときはエラーを返すという処理も追加しても良いかも + for n := range singleNums { + return n + } + return 0 // 本来は見つからなかった場合はエラーを返したい +} diff --git a/pullrequests/single_number/step2.go b/pullrequests/single_number/step2.go new file mode 100644 index 0000000..35834a2 --- /dev/null +++ b/pullrequests/single_number/step2.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package singlenumber + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +調べたところ下記のようにすれば空間計算量がO(1)になる。 +ただし、このXORを使った方法は1つの数以外は全て偶数回必ず出現するという条件を満たさなければ成立しないので、実際にこのように書くのが良い方法だとは思わなかった(ただしビット演算の練習にはなる)。 +*/ +func singleNumberStep2(nums []int) int { + singleNum := 0 + for _, n := range nums { + singleNum ^= n + } + return singleNum +}