From 41eaa0609a2bf65059a4b426613d3277e3b891e7 Mon Sep 17 00:00:00 2001 From: yangfeng Date: Tue, 15 Oct 2019 21:49:25 +0800 Subject: [PATCH 1/3] 301-Week 01 --- Week_01/id_301/array/array.go | 94 ++++++++++++++++++++++++++++ Week_01/id_301/linklist/link_node.go | 14 +++++ Week_01/id_301/linklist/solution.go | 43 +++++++++++++ Week_01/id_301/main.go | 28 +++++++++ 4 files changed, 179 insertions(+) create mode 100644 Week_01/id_301/array/array.go create mode 100644 Week_01/id_301/linklist/link_node.go create mode 100644 Week_01/id_301/linklist/solution.go create mode 100644 Week_01/id_301/main.go diff --git a/Week_01/id_301/array/array.go b/Week_01/id_301/array/array.go new file mode 100644 index 000000000..eedc73bd7 --- /dev/null +++ b/Week_01/id_301/array/array.go @@ -0,0 +1,94 @@ +package array + +import "fmt" + +func removeDuplicates(nums []int) int { + length := len(nums) + index := 0 + for i := 1; i < length; i++ { + if nums[index] != nums[i] { + index += 1 + nums[index] = nums[i] + } + } + return index + 1 +} + +/** +解法思想 : 当一个数组长度为n,移动后k次,当k=n的时候,其实本质上是移动了k对n求余次数 +*/ +func RotateOne(nums []int, k int) { + length := len(nums) + if length <= 1 { + return + } + for i := 0; i < k; i++ { + tmp := nums[length-1] + for j := length - 2; j >= 0; j-- { + nums[j+1] = nums[j] + } + nums[0] = tmp + } +} + +/** +解法思想 : 移动次数简化同上面分析。然后我们从最数组的第一位开始,挨个一次将元素移动到目标位置,移动n次,那么所有元素都将到达最后的位置. + 如果内层刚好移动到 +*/ +func RotateTwo(nums []int, k int) { + length := len(nums) + if length <= 1 || length == k || k == 0 { + return + } + k = k % length + count := 0 + for i := 0; count < length; i++ { + curr := i + pre := nums[i] + for { + next := (curr + k) % length + temp := nums[next] + nums[next] = pre + pre = temp + curr = next + count++ + fmt.Println(curr, "|", i, "|", count) + if curr == i { + break + } + } + } +} + +func RotateThree(nums []int, k int) { + length := len(nums) + if length <= 1 { + return + } + k = k % length + reverseArray(nums, 0, length-1) + reverseArray(nums, 0, k-1) + reverseArray(nums, k, length-1) +} + +func reverseArray(nums []int, start, end int) { + length := len(nums) + if length <= 1 { + return + } + if start >= end { + return + } + if start > length-1 { + start = 0 + } + + if end > length-1 { + end = length - 1 + } + j := end + for i := start; i < j; i++ { + nums[i], nums[j] = nums[j], nums[i] + j-- + } +} diff --git a/Week_01/id_301/linklist/link_node.go b/Week_01/id_301/linklist/link_node.go new file mode 100644 index 000000000..28738b110 --- /dev/null +++ b/Week_01/id_301/linklist/link_node.go @@ -0,0 +1,14 @@ +package linklist + +/** +* Definition for singly-linked list. +* type ListNode struct { +* Val int +* Next *ListNode +* } + */ + +type ListNode struct { + Val int + Next *ListNode +} diff --git a/Week_01/id_301/linklist/solution.go b/Week_01/id_301/linklist/solution.go new file mode 100644 index 000000000..e2b4e83dd --- /dev/null +++ b/Week_01/id_301/linklist/solution.go @@ -0,0 +1,43 @@ +package linklist + +func MergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { + currL1 := l1 + currL2 := l2 + var res *ListNode + res = new(ListNode) + if l1 == nil { + return l2 + } + if l2 == nil { + return l1 + } + if currL1.Val > currL2.Val { + res.Val = currL2.Val + currL2 = currL2.Next + } else { + res.Val = currL1.Val + currL1 = currL1.Next + } + res.Next = new(ListNode) + curr := res + for { + if currL1 == nil { + curr.Next = currL2 + break + } + if currL2 == nil { + curr.Next = currL1 + break + } + if currL1.Val > currL2.Val { + curr.Next.Val = currL2.Val + currL2 = currL2.Next + } else { + curr.Next.Val = currL1.Val + currL1 = currL1.Next + } + curr.Next.Next = new(ListNode) + curr = curr.Next + } + return res +} diff --git a/Week_01/id_301/main.go b/Week_01/id_301/main.go new file mode 100644 index 000000000..8a39e6eb8 --- /dev/null +++ b/Week_01/id_301/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "algo04-01/Week_01/id_301/linklist" + "fmt" +) + +func main() { + //nums := []int{1,2,3,4,5,6} + //array.RotateThree(nums,2) + //fmt.Println(nums) + var l1 *linklist.ListNode + var l2 *linklist.ListNode + l1 = new(linklist.ListNode) + l1.Val = 1 + l1.Next = new(linklist.ListNode) + l1.Next.Val = 4 + l1.Next.Next = new(linklist.ListNode) + l1.Next.Next.Val = 6 + l2 = new(linklist.ListNode) + l2.Val = 2 + l2.Next = new(linklist.ListNode) + l2.Next.Val = 3 + l2.Next.Next = new(linklist.ListNode) + l2.Next.Next.Val = 7 + //fmt.Println(l1.Val) + fmt.Println(linklist.MergeTwoLists(l1, l2).Next.Next.Next.Next.Val) +} From e9db2af6ccdd21a845dccb219c9c1256f612e0f2 Mon Sep 17 00:00:00 2001 From: yangfeng Date: Tue, 15 Oct 2019 22:36:31 +0800 Subject: [PATCH 2/3] 301-Week 01 --- Week_01/id_301/array/array.go | 46 +++++++++++++++++++++++++++++++++-- Week_01/id_301/main.go | 36 +++++++++++++++------------ 2 files changed, 64 insertions(+), 18 deletions(-) diff --git a/Week_01/id_301/array/array.go b/Week_01/id_301/array/array.go index eedc73bd7..9d164bb52 100644 --- a/Week_01/id_301/array/array.go +++ b/Week_01/id_301/array/array.go @@ -2,6 +2,9 @@ package array import "fmt" +/** +移除0 +*/ func removeDuplicates(nums []int) int { length := len(nums) index := 0 @@ -14,7 +17,7 @@ func removeDuplicates(nums []int) int { return index + 1 } -/** +/** 向右移动数组解法1 解法思想 : 当一个数组长度为n,移动后k次,当k=n的时候,其实本质上是移动了k对n求余次数 */ func RotateOne(nums []int, k int) { @@ -31,7 +34,7 @@ func RotateOne(nums []int, k int) { } } -/** +/** 向右移动数组解法2 解法思想 : 移动次数简化同上面分析。然后我们从最数组的第一位开始,挨个一次将元素移动到目标位置,移动n次,那么所有元素都将到达最后的位置. 如果内层刚好移动到 */ @@ -60,6 +63,9 @@ func RotateTwo(nums []int, k int) { } } +/** +向右移动数组解法三 三次反转法 +*/ func RotateThree(nums []int, k int) { length := len(nums) if length <= 1 { @@ -71,6 +77,9 @@ func RotateThree(nums []int, k int) { reverseArray(nums, k, length-1) } +/** +反转数组 +*/ func reverseArray(nums []int, start, end int) { length := len(nums) if length <= 1 { @@ -92,3 +101,36 @@ func reverseArray(nums []int, start, end int) { j-- } } + +/** +合并两个有序数组 双指针从尾部开始处理数据 +*/ +func Merge(nums1 []int, m int, nums2 []int, n int) { + p := m + n - 1 + p1 := m - 1 + p2 := n - 1 + for { + if p1 < 0 { + for ; p2 >= 0; p2-- { + nums1[p] = nums2[p2] + p-- + } + break + } + if p2 < 0 { + for ; p1 >= 0; p1-- { + nums1[p] = nums1[p1] + p-- + } + break + } + if nums1[p1] > nums2[p2] { + nums1[p] = nums1[p1] + p1-- + } else { + nums1[p] = nums2[p2] + p2-- + } + p-- + } +} diff --git a/Week_01/id_301/main.go b/Week_01/id_301/main.go index 8a39e6eb8..ca3097088 100644 --- a/Week_01/id_301/main.go +++ b/Week_01/id_301/main.go @@ -1,7 +1,7 @@ package main import ( - "algo04-01/Week_01/id_301/linklist" + "algo04-01/Week_01/id_301/array" "fmt" ) @@ -9,20 +9,24 @@ func main() { //nums := []int{1,2,3,4,5,6} //array.RotateThree(nums,2) //fmt.Println(nums) - var l1 *linklist.ListNode - var l2 *linklist.ListNode - l1 = new(linklist.ListNode) - l1.Val = 1 - l1.Next = new(linklist.ListNode) - l1.Next.Val = 4 - l1.Next.Next = new(linklist.ListNode) - l1.Next.Next.Val = 6 - l2 = new(linklist.ListNode) - l2.Val = 2 - l2.Next = new(linklist.ListNode) - l2.Next.Val = 3 - l2.Next.Next = new(linklist.ListNode) - l2.Next.Next.Val = 7 + //var l1 *linklist.ListNode + //var l2 *linklist.ListNode + //l1 = new(linklist.ListNode) + //l1.Val = 1 + //l1.Next = new(linklist.ListNode) + //l1.Next.Val = 4 + //l1.Next.Next = new(linklist.ListNode) + //l1.Next.Next.Val = 6 + //l2 = new(linklist.ListNode) + //l2.Val = 2 + //l2.Next = new(linklist.ListNode) + //l2.Next.Val = 3 + //l2.Next.Next = new(linklist.ListNode) + //l2.Next.Next.Val = 7 //fmt.Println(l1.Val) - fmt.Println(linklist.MergeTwoLists(l1, l2).Next.Next.Next.Next.Val) + //fmt.Println(linklist.MergeTwoLists(l1, l2).Next.Next.Next.Next.Val) + a1 := []int{1, 3, 9, 0, 0, 0, 0, 0} + a2 := []int{2, 5, 6} + array.Merge(a1, 3, a2, 3) + fmt.Println(a1) } From 43a1d1b60416edf4556b90d7494d0aa8ec4051b9 Mon Sep 17 00:00:00 2001 From: yangfeng Date: Wed, 16 Oct 2019 15:23:54 +0800 Subject: [PATCH 3/3] 301-Week 01 --- Week_01/id_301/array/array.go | 136 ---------------- Week_01/id_301/linklist/solution.go | 43 ----- Week_01/id_301/main.go | 234 +++++++++++++++++++++++++++- 3 files changed, 229 insertions(+), 184 deletions(-) delete mode 100644 Week_01/id_301/array/array.go delete mode 100644 Week_01/id_301/linklist/solution.go diff --git a/Week_01/id_301/array/array.go b/Week_01/id_301/array/array.go deleted file mode 100644 index 9d164bb52..000000000 --- a/Week_01/id_301/array/array.go +++ /dev/null @@ -1,136 +0,0 @@ -package array - -import "fmt" - -/** -移除0 -*/ -func removeDuplicates(nums []int) int { - length := len(nums) - index := 0 - for i := 1; i < length; i++ { - if nums[index] != nums[i] { - index += 1 - nums[index] = nums[i] - } - } - return index + 1 -} - -/** 向右移动数组解法1 -解法思想 : 当一个数组长度为n,移动后k次,当k=n的时候,其实本质上是移动了k对n求余次数 -*/ -func RotateOne(nums []int, k int) { - length := len(nums) - if length <= 1 { - return - } - for i := 0; i < k; i++ { - tmp := nums[length-1] - for j := length - 2; j >= 0; j-- { - nums[j+1] = nums[j] - } - nums[0] = tmp - } -} - -/** 向右移动数组解法2 -解法思想 : 移动次数简化同上面分析。然后我们从最数组的第一位开始,挨个一次将元素移动到目标位置,移动n次,那么所有元素都将到达最后的位置. - 如果内层刚好移动到 -*/ -func RotateTwo(nums []int, k int) { - length := len(nums) - if length <= 1 || length == k || k == 0 { - return - } - k = k % length - count := 0 - for i := 0; count < length; i++ { - curr := i - pre := nums[i] - for { - next := (curr + k) % length - temp := nums[next] - nums[next] = pre - pre = temp - curr = next - count++ - fmt.Println(curr, "|", i, "|", count) - if curr == i { - break - } - } - } -} - -/** -向右移动数组解法三 三次反转法 -*/ -func RotateThree(nums []int, k int) { - length := len(nums) - if length <= 1 { - return - } - k = k % length - reverseArray(nums, 0, length-1) - reverseArray(nums, 0, k-1) - reverseArray(nums, k, length-1) -} - -/** -反转数组 -*/ -func reverseArray(nums []int, start, end int) { - length := len(nums) - if length <= 1 { - return - } - if start >= end { - return - } - if start > length-1 { - start = 0 - } - - if end > length-1 { - end = length - 1 - } - j := end - for i := start; i < j; i++ { - nums[i], nums[j] = nums[j], nums[i] - j-- - } -} - -/** -合并两个有序数组 双指针从尾部开始处理数据 -*/ -func Merge(nums1 []int, m int, nums2 []int, n int) { - p := m + n - 1 - p1 := m - 1 - p2 := n - 1 - for { - if p1 < 0 { - for ; p2 >= 0; p2-- { - nums1[p] = nums2[p2] - p-- - } - break - } - if p2 < 0 { - for ; p1 >= 0; p1-- { - nums1[p] = nums1[p1] - p-- - } - break - } - if nums1[p1] > nums2[p2] { - nums1[p] = nums1[p1] - p1-- - } else { - nums1[p] = nums2[p2] - p2-- - } - p-- - } -} diff --git a/Week_01/id_301/linklist/solution.go b/Week_01/id_301/linklist/solution.go deleted file mode 100644 index e2b4e83dd..000000000 --- a/Week_01/id_301/linklist/solution.go +++ /dev/null @@ -1,43 +0,0 @@ -package linklist - -func MergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { - currL1 := l1 - currL2 := l2 - var res *ListNode - res = new(ListNode) - if l1 == nil { - return l2 - } - if l2 == nil { - return l1 - } - if currL1.Val > currL2.Val { - res.Val = currL2.Val - currL2 = currL2.Next - } else { - res.Val = currL1.Val - currL1 = currL1.Next - } - res.Next = new(ListNode) - curr := res - for { - if currL1 == nil { - curr.Next = currL2 - break - } - if currL2 == nil { - curr.Next = currL1 - break - } - if currL1.Val > currL2.Val { - curr.Next.Val = currL2.Val - currL2 = currL2.Next - } else { - curr.Next.Val = currL1.Val - currL1 = currL1.Next - } - curr.Next.Next = new(ListNode) - curr = curr.Next - } - return res -} diff --git a/Week_01/id_301/main.go b/Week_01/id_301/main.go index ca3097088..580e8518a 100644 --- a/Week_01/id_301/main.go +++ b/Week_01/id_301/main.go @@ -1,7 +1,7 @@ package main import ( - "algo04-01/Week_01/id_301/array" + "algo04-01/Week_01/id_301/linklist" "fmt" ) @@ -25,8 +25,232 @@ func main() { //l2.Next.Next.Val = 7 //fmt.Println(l1.Val) //fmt.Println(linklist.MergeTwoLists(l1, l2).Next.Next.Next.Next.Val) - a1 := []int{1, 3, 9, 0, 0, 0, 0, 0} - a2 := []int{2, 5, 6} - array.Merge(a1, 3, a2, 3) - fmt.Println(a1) + a1 := []int{1, 3, 9, 8, 7} + fmt.Println(TwoSum(a1, 10)) +} + +/** +移除重复元素 +*/ +func removeDuplicates(nums []int) int { + length := len(nums) + index := 0 + for i := 1; i < length; i++ { + if nums[index] != nums[i] { + index += 1 + nums[index] = nums[i] + } + } + return index + 1 +} + +/** 向右移动数组解法1 +解法思想 : 当一个数组长度为n,移动后k次,当k=n的时候,其实本质上是移动了k对n求余次数 +*/ +func RotateOne(nums []int, k int) { + length := len(nums) + if length <= 1 { + return + } + for i := 0; i < k; i++ { + tmp := nums[length-1] + for j := length - 2; j >= 0; j-- { + nums[j+1] = nums[j] + } + nums[0] = tmp + } +} + +/** 向右移动数组解法2 +解法思想 : 移动次数简化同上面分析。然后我们从最数组的第一位开始,挨个一次将元素移动到目标位置,移动n次,那么所有元素都将到达最后的位置. + 如果内层刚好移动到 +*/ +func RotateTwo(nums []int, k int) { + length := len(nums) + if length <= 1 || length == k || k == 0 { + return + } + k = k % length + count := 0 + for i := 0; count < length; i++ { + curr := i + pre := nums[i] + for { + next := (curr + k) % length + temp := nums[next] + nums[next] = pre + pre = temp + curr = next + count++ + fmt.Println(curr, "|", i, "|", count) + if curr == i { + break + } + } + } +} + +/** +向右移动数组解法三 三次反转法 +*/ +func RotateThree(nums []int, k int) { + length := len(nums) + if length <= 1 { + return + } + k = k % length + reverseArray(nums, 0, length-1) + reverseArray(nums, 0, k-1) + reverseArray(nums, k, length-1) +} + +/** +反转数组 +*/ +func reverseArray(nums []int, start, end int) { + length := len(nums) + if length <= 1 { + return + } + if start >= end { + return + } + if start > length-1 { + start = 0 + } + + if end > length-1 { + end = length - 1 + } + j := end + for i := start; i < j; i++ { + nums[i], nums[j] = nums[j], nums[i] + j-- + } +} + +/** +合并两个有序数组 双指针从尾部开始处理数据 +*/ +func Merge(nums1 []int, m int, nums2 []int, n int) { + p := m + n - 1 + p1 := m - 1 + p2 := n - 1 + for { + if p1 < 0 { + for ; p2 >= 0; p2-- { + nums1[p] = nums2[p2] + p-- + } + break + } + if p2 < 0 { + for ; p1 >= 0; p1-- { + nums1[p] = nums1[p1] + p-- + } + break + } + if nums1[p1] > nums2[p2] { + nums1[p] = nums1[p1] + p1-- + } else { + nums1[p] = nums2[p2] + p2-- + } + p-- + } +} + +/** +两数之和 +*/ +func TwoSum(nums []int, target int) []int { + var numsMap map[int]int + numsMap = make(map[int]int) + for k, v := range nums { + need := target - v + index, ok := numsMap[need] + if ok { + return []int{k, index} + break + } else { + numsMap[v] = k + } + } + return []int{} +} + +/** +移动0 +*/ +func moveZeroes(nums []int) { + curr := 0 + for k, v := range nums { + if v != 0 { + nums[curr] = v + if curr != k { + nums[k] = 0 + } + curr++ + } + } +} + +/** +加一 +*/ +func plusOne(digits []int) []int { + length := len(digits) + for i := length - 1; i >= 0; i-- { + if digits[i] != 9 { + digits[i]++ + return digits + } else { + digits[i] = 0 + } + } + return append([]int{1}, digits...) +} + +func MergeTwoLists(l1 *linklist.ListNode, l2 *linklist.ListNode) *linklist.ListNode { + currL1 := l1 + currL2 := l2 + var res *linklist.ListNode + res = new(linklist.ListNode) + if l1 == nil { + return l2 + } + if l2 == nil { + return l1 + } + if currL1.Val > currL2.Val { + res.Val = currL2.Val + currL2 = currL2.Next + } else { + res.Val = currL1.Val + currL1 = currL1.Next + } + res.Next = new(linklist.ListNode) + curr := res + for { + if currL1 == nil { + curr.Next = currL2 + break + } + if currL2 == nil { + curr.Next = currL1 + break + } + if currL1.Val > currL2.Val { + curr.Next.Val = currL2.Val + currL2 = currL2.Next + } else { + curr.Next.Val = currL1.Val + currL1 = currL1.Next + } + curr.Next.Next = new(linklist.ListNode) + curr = curr.Next + } + return res }