fix: fixed error in the MaxProductOfThree algorithm (#1295)

* fix: fixed error in the MaxProductOfThree algorithm

Fixed the error in the MaxProductOfThree by initializing the max and min
variables to null instead of -1. The checks were then altered to check
for null instead of -1.

Also wrote more tests, which randomly generated small arrays and
compared the output of the maxProductOfThree-algorithm to the output of
a slower, but complete, function which calculates all posible
triple-products of the values of the array.

Fixes: #1294

* fix: Added newlines at the end of the files
This commit is contained in:
Xolvez
2023-02-18 20:35:07 +01:00
committed by GitHub
parent 5ce828b3fe
commit 6aa3314b93
2 changed files with 59 additions and 6 deletions

View File

@ -10,25 +10,25 @@ export function maxProductOfThree (arrayItems) {
const n = arrayItems.length const n = arrayItems.length
if (n < 3) throw new Error('Triplet cannot exist with the given array') if (n < 3) throw new Error('Triplet cannot exist with the given array')
let max1 = arrayItems[0] let max1 = arrayItems[0]
let max2 = -1 let max2 = null
let max3 = -1 let max3 = null
let min1 = arrayItems[0] let min1 = arrayItems[0]
let min2 = -1 let min2 = null
for (let i = 1; i < n; i++) { for (let i = 1; i < n; i++) {
if (arrayItems[i] > max1) { if (arrayItems[i] > max1) {
max3 = max2 max3 = max2
max2 = max1 max2 = max1
max1 = arrayItems[i] max1 = arrayItems[i]
} else if (max2 === -1 || arrayItems[i] > max2) { } else if (max2 === null || arrayItems[i] > max2) {
max3 = max2 max3 = max2
max2 = arrayItems[i] max2 = arrayItems[i]
} else if (max3 === -1 || arrayItems[i] > max3) { } else if (max3 === null || arrayItems[i] > max3) {
max3 = arrayItems[i] max3 = arrayItems[i]
} }
if (arrayItems[i] < min1) { if (arrayItems[i] < min1) {
min2 = min1 min2 = min1
min1 = arrayItems[i] min1 = arrayItems[i]
} else if (min2 === -1 || arrayItems[i] < min2) { } else if (min2 === null || arrayItems[i] < min2) {
min2 = arrayItems[i] min2 = arrayItems[i]
} }
} }

View File

@ -15,3 +15,56 @@ describe('MaxProductOfThree', () => {
expect(maxProductOfThree([10, -6, 5, 3, 1, -10])).toBe(600) expect(maxProductOfThree([10, -6, 5, 3, 1, -10])).toBe(600)
}) })
}) })
// Tests using random arrays of size 3 to 5, with values rangin from -4 to 4
// The output is compared to a slower function that calculates all possible products of 3 numbers in the array and returns the largest one
describe('MaxProductOfThree, random arrays of size 3 to 5', () => {
// Slower function that operates in O(n^3), where n is the length of the input array.
// Calculates all possible products of 3 numbers in the array and returns the largest
function completeMaxThree (array) {
let maximumProduct = null
for (let i = 0; i < array.length - 2; i++) {
for (let j = i + 1; j < array.length - 1; j++) {
for (let k = j + 1; k < array.length; k++) {
const currentProduct = array[i] * array[j] * array[k]
if (maximumProduct === null || currentProduct > maximumProduct) {
maximumProduct = currentProduct
}
}
}
}
return maximumProduct
}
// Set up consts for the tests
const maxValue = 4
const minValue = -4
const maxLength = 5
const minLength = 3
const numberOfRandomTests = 5000
// Run each test
for (let i = 0; i < numberOfRandomTests; i++) {
const arr = []
// Randomize the length of the array in the current test
const length = Math.floor(Math.random() * (maxLength - minLength) + minLength)
// Fill the array with random values in the specified range
for (let j = 0; j < length + 1; j++) {
arr.push(Math.floor(Math.random() * (maxValue - minValue) + minValue))
}
// Calculate the actual max product, slow but completely
const expectedProduct = completeMaxThree(arr)
// Set up the expectation
it('Expect the array ' + arr.toString() + ' to return the maximum three product of ' + expectedProduct, () => {
// Calculate the max three product using the function being tested
const actualProduct = maxProductOfThree(arr)
// Was unable to use expect().toBe(), since it sometimes compared 0 to -0, and that would not pass
// At the same time, standardjs forbid me from checking for === -0 to convert to 0
expect(actualProduct === expectedProduct).toBeTruthy()
})
}
})