From 88658ff1d5bbbdaf3be8c33ec344abd8cc962ec9 Mon Sep 17 00:00:00 2001 From: VicRen Date: Wed, 11 Nov 2020 09:04:36 +0800 Subject: [PATCH] 20201111: sf --- 20201111/main.go | 65 ++++++++++++++++++++ 20201111/main_test.go | 134 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 20201111/main.go create mode 100644 20201111/main_test.go diff --git a/20201111/main.go b/20201111/main.go new file mode 100644 index 0000000..07df8e0 --- /dev/null +++ b/20201111/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "errors" + "fmt" + "math/rand" +) + +func main() { + r := rand.Intn(100) + fmt.Println("r:", r) + var src []int + for i := 0; i < 100; i++ { + src = append(src, i) + if i == r { + continue + } + src = append(src, i) + } + n, _ := findSingleNumber(src) + fmt.Println("lost number:", n) + n, _ = findSingleNumber2(src) + fmt.Println("lost number2:", n) + n, _ = findSingleNumber3(src) + fmt.Println("lost number3:", n) +} + +func findSingleNumber(src []int) (int, error) { + m := map[int]int{} + for _, n := range src { + m[n] += 1 + } + for k, v := range m { + if v == 1 { + return k, nil + } + } + return 0, errors.New("not found") +} + +func findSingleNumber2(src []int) (int, error) { + m := map[int]struct{}{} + for _, n := range src { + if _, ok := m[n]; ok { + delete(m, n) + } else { + m[n] = struct{}{} + } + } + for k := range m { + return k, nil + } + return 0, errors.New("not found") +} + +func findSingleNumber3(src []int) (int, error) { + num := 0 + for _, n := range src { + num = num ^ n + } + if num == 0 { + return 0, errors.New("not found") + } + return num, nil +} diff --git a/20201111/main_test.go b/20201111/main_test.go new file mode 100644 index 0000000..42fddf4 --- /dev/null +++ b/20201111/main_test.go @@ -0,0 +1,134 @@ +package main + +import ( + "testing" +) + +func Test_findSingleNumber(t *testing.T) { + type args struct { + src []int + } + tests := []struct { + name string + args args + want int + wantErr bool + }{ + { + "example_1", + args{[]int{2, 2, 1}}, + 1, + false, + }, + { + "example_2", + args{[]int{4, 1, 2, 1, 2}}, + 4, + false, + }, + { + "example_3", + args{[]int{4, 4, 1, 2, 1, 2}}, + 0, + true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := findSingleNumber(tt.args.src) + if (err != nil) != tt.wantErr { + t.Errorf("findSingleNumber() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("findSingleNumber() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_findSingleNumber2(t *testing.T) { + type args struct { + src []int + } + tests := []struct { + name string + args args + want int + wantErr bool + }{ + { + "example_1", + args{[]int{2, 2, 1}}, + 1, + false, + }, + { + "example_2", + args{[]int{4, 1, 2, 1, 2}}, + 4, + false, + }, + { + "example_3", + args{[]int{4, 4, 1, 2, 1, 2}}, + 0, + true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := findSingleNumber2(tt.args.src) + if (err != nil) != tt.wantErr { + t.Errorf("findSingleNumber2() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("findSingleNumber2() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_findSingleNumber3(t *testing.T) { + type args struct { + src []int + } + tests := []struct { + name string + args args + want int + wantErr bool + }{ + { + "example_1", + args{[]int{2, 2, 1}}, + 1, + false, + }, + { + "example_2", + args{[]int{4, 1, 2, 1, 2}}, + 4, + false, + }, + { + "example_3", + args{[]int{4, 4, 1, 2, 1, 2}}, + 0, + true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := findSingleNumber3(tt.args.src) + if (err != nil) != tt.wantErr { + t.Errorf("findSingleNumber3() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("findSingleNumber3() = %v, want %v", got, tt.want) + } + }) + } +}