From 872f33325244800b55db2f4f7b8c7be281c57f5f Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Thu, 5 Dec 2024 01:11:49 +0900 Subject: [PATCH 1/3] neverlish: week01 --- contains-duplicate/neverlish.go | 30 +++++++++++++++ house-robber/neverlish.go | 41 +++++++++++++++++++++ longest-consecutive-sequence/neverlish.go | 45 +++++++++++++++++++++++ top-k-frequent-elements/neverlish.go | 40 ++++++++++++++++++++ valid-palindrome/neverlish.go | 42 +++++++++++++++++++++ 5 files changed, 198 insertions(+) create mode 100644 contains-duplicate/neverlish.go create mode 100644 house-robber/neverlish.go create mode 100644 longest-consecutive-sequence/neverlish.go create mode 100644 top-k-frequent-elements/neverlish.go create mode 100644 valid-palindrome/neverlish.go diff --git a/contains-duplicate/neverlish.go b/contains-duplicate/neverlish.go new file mode 100644 index 000000000..046b377b5 --- /dev/null +++ b/contains-duplicate/neverlish.go @@ -0,0 +1,30 @@ +package main + +import "testing" + +func Test(t *testing.T) { + result1 := containsDuplicate([]int{1, 2, 3, 1}) + + if result1 != true { + t.Fatal("failed test1") + } + + result2 := containsDuplicate([]int{1, 2, 3, 4}) + + if result2 != false { + t.Fatal("failed test2") + } +} + +func containsDuplicate(nums []int) bool { + data := make(map[int]bool) + + for _, num := range nums { + if data[num] { + return true + } else { + data[num] = true + } + } + return false +} diff --git a/house-robber/neverlish.go b/house-robber/neverlish.go new file mode 100644 index 000000000..23949446b --- /dev/null +++ b/house-robber/neverlish.go @@ -0,0 +1,41 @@ +package main + +import ( + "testing" +) + +func Test(t *testing.T) { + result1 := rob([]int{1, 2, 3, 1}) + + if result1 != 4 { + t.Fatal("failed test1") + } + + result2 := rob([]int{2, 7, 9, 3, 1}) + + if result2 != 12 { + t.Fatal("failed test2") + } +} + +func rob(nums []int) int { + length := len(nums) + + if length == 0 { + return 0 + } + if length == 1 { + return nums[0] + } + + moneys := make([]int, length) + + moneys[0] = nums[0] + moneys[1] = max(nums[0], nums[1]) + + for position := 2; position < length; position++ { + moneys[position] = max(moneys[position-1], moneys[position-2]+nums[position]) + } + + return moneys[length-1] +} diff --git a/longest-consecutive-sequence/neverlish.go b/longest-consecutive-sequence/neverlish.go new file mode 100644 index 000000000..6d6616ad0 --- /dev/null +++ b/longest-consecutive-sequence/neverlish.go @@ -0,0 +1,45 @@ +package main + +import "testing" + +func Test(t *testing.T) { + result := longestConsecutive([]int{100, 4, 200, 1, 3, 2}) + + if result != 4 { + t.Fatal("failed test") + } + + result2 := longestConsecutive([]int{0, 3, 7, 2, 5, 8, 4, 6, 0, 1}) + + if result2 != 9 { + t.Fatal("failed test2") + } +} + +func longestConsecutive(nums []int) int { + numsSet := make(map[int]bool) + + for _, num := range nums { + numsSet[num] = true + } + + longest := 0 + + for num := range numsSet { + if !numsSet[num-1] { + currentNum := num + currentLength := 1 + + for numsSet[currentNum+1] { + currentNum++ + currentLength++ + } + + if currentLength > longest { + longest = currentLength + } + } + } + + return longest +} diff --git a/top-k-frequent-elements/neverlish.go b/top-k-frequent-elements/neverlish.go new file mode 100644 index 000000000..5da8e7cf1 --- /dev/null +++ b/top-k-frequent-elements/neverlish.go @@ -0,0 +1,40 @@ +package main + +import "testing" + +func Test(t *testing.T) { + result := topKFrequent([]int{1, 1, 1, 2, 2, 3}, 2) + + if result[0] != 1 || result[1] != 2 { + t.Fatal("failed test") + } +} + +func topKFrequent(nums []int, k int) []int { + freq := make(map[int]int) + + for _, num := range nums { + freq[num]++ + } + + freq_by_counts := make(map[int][]int) + + for num, count := range freq { + if _, ok := freq_by_counts[count]; !ok { + freq_by_counts[count] = []int{} + } + freq_by_counts[count] = append(freq_by_counts[count], num) + } + + result := []int{} + + for count := len(nums); count > 0; count-- { + if nums, ok := freq_by_counts[count]; ok { + if len(result) >= k { + break + } + result = append(result, nums...) + } + } + return result +} diff --git a/valid-palindrome/neverlish.go b/valid-palindrome/neverlish.go new file mode 100644 index 000000000..e92dce87e --- /dev/null +++ b/valid-palindrome/neverlish.go @@ -0,0 +1,42 @@ +package main + +import ( + "strings" + "testing" +) + +func Test(t *testing.T) { + result1 := isPalindrome("A man, a plan, a canal: Panama") + if result1 != true { + t.Fatal("failed test1") + } + + result2 := isPalindrome("race a car") + if result2 != false { + t.Fatal("failed test2") + } + + result3 := isPalindrome("") + + if result3 != true { + t.Fatal("failed test3") + } +} + +func isPalindrome(s string) bool { + s = strings.ToLower(s) + + var filtered []rune + for _, r := range s { + if ('a' <= r && r <= 'z') || ('0' <= r && r <= '9') { + filtered = append(filtered, r) + } + } + + for index, r := range filtered[:len(filtered)/2] { + if r != filtered[len(filtered)-index-1] { + return false + } + } + return true +} From 487db4c222f5f7d0889a32a17d425737a7ace664 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Thu, 5 Dec 2024 18:52:17 +0900 Subject: [PATCH 2/3] refactor: optimize result slice initialization in topKFrequent function --- top-k-frequent-elements/neverlish.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/top-k-frequent-elements/neverlish.go b/top-k-frequent-elements/neverlish.go index 5da8e7cf1..f4a91d651 100644 --- a/top-k-frequent-elements/neverlish.go +++ b/top-k-frequent-elements/neverlish.go @@ -26,7 +26,7 @@ func topKFrequent(nums []int, k int) []int { freq_by_counts[count] = append(freq_by_counts[count], num) } - result := []int{} + result := make([]int, 0, k) for count := len(nums); count > 0; count-- { if nums, ok := freq_by_counts[count]; ok { From 73af29d33988fcd47ba35acb99d2f75ef95c7c77 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Thu, 5 Dec 2024 18:59:03 +0900 Subject: [PATCH 3/3] docs: add time and space complexity comments to algorithms --- contains-duplicate/neverlish.go | 3 +++ house-robber/neverlish.go | 3 +++ longest-consecutive-sequence/neverlish.go | 3 +++ top-k-frequent-elements/neverlish.go | 3 +++ valid-palindrome/neverlish.go | 3 +++ 5 files changed, 15 insertions(+) diff --git a/contains-duplicate/neverlish.go b/contains-duplicate/neverlish.go index 046b377b5..4c3ce0244 100644 --- a/contains-duplicate/neverlish.go +++ b/contains-duplicate/neverlish.go @@ -1,3 +1,6 @@ +// 시간복잡도: O(n) +// 공간복잡도: O(n) + package main import "testing" diff --git a/house-robber/neverlish.go b/house-robber/neverlish.go index 23949446b..ee7402a60 100644 --- a/house-robber/neverlish.go +++ b/house-robber/neverlish.go @@ -1,3 +1,6 @@ +// 시간복잡도: O(n) +// 공간복잡도: O(n) + package main import ( diff --git a/longest-consecutive-sequence/neverlish.go b/longest-consecutive-sequence/neverlish.go index 6d6616ad0..c74dc1a20 100644 --- a/longest-consecutive-sequence/neverlish.go +++ b/longest-consecutive-sequence/neverlish.go @@ -1,3 +1,6 @@ +// 시간복잡도: O(n) +// 공간복잡도: O(n) + package main import "testing" diff --git a/top-k-frequent-elements/neverlish.go b/top-k-frequent-elements/neverlish.go index f4a91d651..6c05280be 100644 --- a/top-k-frequent-elements/neverlish.go +++ b/top-k-frequent-elements/neverlish.go @@ -1,3 +1,6 @@ +// 시간복잡도: O(n) +// 공간복잡도: O(n) + package main import "testing" diff --git a/valid-palindrome/neverlish.go b/valid-palindrome/neverlish.go index e92dce87e..fbaf341a9 100644 --- a/valid-palindrome/neverlish.go +++ b/valid-palindrome/neverlish.go @@ -1,3 +1,6 @@ +// 시간복잡도: O(n) +// 공간복잡도: O(n) + package main import (