diff --git a/PrefixSum/BasicPrefixSum.js b/PrefixSum/BasicPrefixSum.js new file mode 100644 index 0000000000..f1513bcc98 --- /dev/null +++ b/PrefixSum/BasicPrefixSum.js @@ -0,0 +1,18 @@ +function prefixSum(arr) { + if (!Array.isArray(arr) || arr.some((num) => typeof num !== 'number')) { + throw new TypeError(`Input must be an array of numbers`) + } + + const pSum = [] + + let sum = 0 + + for (const num of arr) { + sum += num + pSum.push(sum) + } + + return pSum +} + +export { prefixSum } diff --git a/PrefixSum/tests/BasicPrefixSum.test.js b/PrefixSum/tests/BasicPrefixSum.test.js new file mode 100644 index 0000000000..29d0d9bd5d --- /dev/null +++ b/PrefixSum/tests/BasicPrefixSum.test.js @@ -0,0 +1,21 @@ +import { prefixSum } from '../BasicPrefixSum.js' +import { describe, it, expect } from 'vitest' + +describe('prefixSum', () => { + it(`Should return computed prefix sum array for a passed input array`, () => { + expect(prefixSum([3, 6, 9, 15])).toEqual([3, 9, 18, 33]) + expect(prefixSum([0, 5, -2, 4])).toEqual([0, 5, 3, 7]) + }) + + it(`Should return empty array when passed input array is empty`, () => { + expect(prefixSum([])).toEqual([]) + }) + + it(`should throw TypeError if input is not an array of numbers`, () => { + expect(() => prefixSum('array')).toThrow(TypeError) + expect(() => prefixSum(1)).toThrow(TypeError) + expect(() => prefixSum([1, '2'])).toThrow(TypeError) + expect(() => prefixSum([1, true])).toThrow(TypeError) + expect(() => prefixSum([{}, 2])).toThrow(TypeError) + }) +})