Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Single Number #48

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions pullrequests/single_number/step1.go
Original file line number Diff line number Diff line change
@@ -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)
}
Comment on lines +17 to +19
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

私は、この判定を次のループに回すと思います。そちらのほうがデバッグしやすそうです。

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは趣味の範囲でしょう。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

デバッグのしやすさという観点でコードを見れてなかったので勉強になりました

}
// 必要に応じてlen(singleNums) != 1のときはエラーを返すという処理も追加しても良いかも
for n := range singleNums {
return n
}
return 0 // 本来は見つからなかった場合はエラーを返したい
}
19 changes: 19 additions & 0 deletions pullrequests/single_number/step2.go
Original file line number Diff line number Diff line change
@@ -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
}