diff --git a/README.md b/README.md index a54e76f..385b836 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ problems from * [Day 141](https://github.com/vaskoz/dailycodingproblem-go/issues/294) * [Day 142](https://github.com/vaskoz/dailycodingproblem-go/issues/297) * [Day 143](https://github.com/vaskoz/dailycodingproblem-go/issues/299) +* [Day 144](https://github.com/vaskoz/dailycodingproblem-go/issues/301) * [Day 145](https://github.com/vaskoz/dailycodingproblem-go/issues/302) * [Day 146](https://github.com/vaskoz/dailycodingproblem-go/issues/303) * [Day 147](https://github.com/vaskoz/dailycodingproblem-go/issues/304) diff --git a/day144/problem.go b/day144/problem.go new file mode 100644 index 0000000..810bea6 --- /dev/null +++ b/day144/problem.go @@ -0,0 +1,23 @@ +package day144 + +// ClosestLargerNumberIndexBrute looks for the closest number larger +// than the target and returns the index of that number. +// If no number if found, then -1 is returned. +// Runs in O(N) time. +func ClosestLargerNumberIndexBrute(nums []int, targetIndex int) int { + if targetIndex < 0 || targetIndex >= len(nums) { + panic("index out of bounds") + } + val := nums[targetIndex] + left, right := targetIndex-1, targetIndex+1 + for left >= 0 || right < len(nums) { + if left >= 0 && nums[left] > val { + return left + } else if right < len(nums) && nums[right] > val { + return right + } + left-- + right++ + } + return -1 +} diff --git a/day144/problem_test.go b/day144/problem_test.go new file mode 100644 index 0000000..345036d --- /dev/null +++ b/day144/problem_test.go @@ -0,0 +1,40 @@ +package day144 + +import "testing" + +var testcases = []struct { + nums []int + targetIndex int + expected int +}{ + {[]int{4, 1, 3, 5, 6}, 0, 3}, + {[]int{4, 1, 3, 5, 6}, 4, -1}, + {[]int{4, 1, 3, 5, 6}, 1, 0}, +} + +func TestClosestLargerNumberIndexBrute(t *testing.T) { + t.Parallel() + for _, tc := range testcases { + if result := ClosestLargerNumberIndexBrute(tc.nums, tc.targetIndex); result != tc.expected { + t.Errorf("Expected %v got %v", tc.expected, result) + } + } +} + +func TestClosestLargerNumberIndexBruteBoundsCheck(t *testing.T) { + t.Parallel() + defer func() { + if err := recover(); err == nil { + t.Errorf("It should panic with an index out of bounds") + } + }() + ClosestLargerNumberIndexBrute([]int{1, 2}, 3) +} + +func BenchmarkClosestLargerNumberIndexBrute(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + ClosestLargerNumberIndexBrute(tc.nums, tc.targetIndex) + } + } +}