From 1d211d12e17eaff59351d838053989ee125dbb0d Mon Sep 17 00:00:00 2001 From: Yu Zhao Date: Sat, 12 May 2018 12:31:45 +0800 Subject: [PATCH] update --- ch04/4.5_set.go | 27 ++++++++++++++++++++++++ ch05/ex1.go | 29 ++++++++++++++++++++++++++ ch05/ex2.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ ch05/search2d.go | 37 +++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100644 ch04/4.5_set.go create mode 100644 ch05/ex1.go create mode 100644 ch05/ex2.go create mode 100644 ch05/search2d.go diff --git a/ch04/4.5_set.go b/ch04/4.5_set.go new file mode 100644 index 0000000..9ac23e4 --- /dev/null +++ b/ch04/4.5_set.go @@ -0,0 +1,27 @@ +package main + +import "fmt" + +type Set map[interface{}]bool + +func (s *Set) Add(key interface{}) { + (*s)[key] = true +} + +func (s *Set) Remove(key interface{}) { + delete((*s), key) +} + +func (s *Set) Find(key interface{}) bool { + return (*s)[key] +} + +func main() { + mp := make(Set) + mp.Add("a") + mp.Add("b") + mp.Add("a") + fmt.Println(mp.Find("a")) + fmt.Println(mp.Find("b")) + fmt.Println(mp.Find("c")) +} diff --git a/ch05/ex1.go b/ch05/ex1.go new file mode 100644 index 0000000..d2eaa64 --- /dev/null +++ b/ch05/ex1.go @@ -0,0 +1,29 @@ +// find first repeated in a list + +package main + +import ( + "fmt" +) + +func main() { + arr1 := []int{1,2,3,1,2,3} + arr2 := []int{1,1,0,0} + arr3 := []int{1,2,3,4,5} + fmt.Println(findFirstRepeat(arr1)) + fmt.Println(findFirstRepeat(arr2)) + fmt.Println(findFirstRepeat(arr3)) +} + + +func findFirstRepeat(arr []int) (int, bool) { // return index, found + table := make(map[int]bool, len(arr)) + for index, item := range arr { + if !table[item] { + table[item] = true + } else { + return index, true + } + } + return -1, false +} diff --git a/ch05/ex2.go b/ch05/ex2.go new file mode 100644 index 0000000..3682ecb --- /dev/null +++ b/ch05/ex2.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "sort" +) + +func main() { + arr := []int{1,5,6,7,2,8,3,4,9} + + fmt.Println(find3ForSum(arr, 13)) + fmt.Println(find3ForSum1(arr, 13)) +} + +func find3ForSum(arr []int, sum int) (int, int, int, bool) { + // brute force, O(n^3) + length := len(arr) + + for i := 0; i < length - 2; i ++ { + for j := i + 1; j < length - 1; j ++ { + for k := j + 1; k < length; k ++ { + if arr[i] + arr[j] + arr[k] == sum { + return arr[i], arr[j], arr[k], true + } + } + } + } + return -1, -1, -1, false +} + +func find3ForSum1(arr []int, sum int) (int, int, int, bool) { + sort.Slice(arr, func (i, j int) bool { + return arr[i] < arr[j] + }) + // fmt.Println(arr) + + length := len(arr) + + for i := 0; i < length - 2; i ++ { + j := i + 1 + k := length - 1 + for ; j < length - 1 && k > j; { + temp := arr[i] + arr[j] + arr[k] + if temp == sum { + return arr[i], arr[j], arr[k], true + } else if temp > sum { + k -- + } else { + j ++ + } + } + } + return -1, -1, -1, false +} diff --git a/ch05/search2d.go b/ch05/search2d.go new file mode 100644 index 0000000..bb5fcb7 --- /dev/null +++ b/ch05/search2d.go @@ -0,0 +1,37 @@ +// 5.37 +package main + +import "fmt" + +func main() { + matrix := [][]int{ + []int{1,11,21,31}, + []int{2,12,22,32}, + []int{3,13,23,33}, + []int{4,14,24,34}} + + fmt.Println(find2d(matrix, -1)) + fmt.Println(find2d(matrix, 1)) + fmt.Println(find2d(matrix, 31)) + fmt.Println(find2d(matrix, 2)) + fmt.Println(find2d(matrix, 13)) + fmt.Println(find2d(matrix, 4)) + fmt.Println(find2d(matrix, 34)) + fmt.Println(find2d(matrix, 100)) +} + +func find2d(matrix[][]int, target int) (row, col int) { + col = len(matrix[0]) - 1 + + for row < len(matrix) && col >= 0 { + this := matrix[row][col] + if this == target { + return + } else if this < target { + row ++ + } else { + col -- + } + } + return -1, -1 +}