Skip to content

Commit

Permalink
Merge pull request #308 from vaskoz/day144
Browse files Browse the repository at this point in the history
Day144
  • Loading branch information
vaskoz committed Jan 17, 2019
2 parents 27da167 + 0ceecd5 commit cabaf72
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
23 changes: 23 additions & 0 deletions day144/problem.go
Original file line number Diff line number Diff line change
@@ -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
}
40 changes: 40 additions & 0 deletions day144/problem_test.go
Original file line number Diff line number Diff line change
@@ -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)
}
}
}

0 comments on commit cabaf72

Please sign in to comment.