Repository: vaskoz/dailycodingproblem-go (go)

Issue:
Day 144
Good morning! Here's your coding interview problem for today.

This problem was asked by Google.

Given an array of numbers and an index i, return the index of the nearest larger number of the number at index i, where distance is measured in array indices.

For example, given `[4, 1, 3, 5, 6]` and index 0, you should return 3.

If two distances to larger numbers are the equal, then return any one of them. If the array at i doesn't have a nearest larger integer, then return null.

Follow-up: If you can preprocess the array, can you do this in constant time?

Pull request:
Day144
Resolves #301.

Patch:
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
+}


Test patch:
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)
+		}
+	}
+}