diff --git a/Data-Structures/Array/BasicPrefixSum.js b/Data-Structures/Array/BasicPrefixSum.js new file mode 100644 index 0000000000..4679c6734a --- /dev/null +++ b/Data-Structures/Array/BasicPrefixSum.js @@ -0,0 +1,24 @@ +/** + * Computes prefix sums for a numeric array. + * Example: [2, 3, 5] → [2, 5, 10] + * @param {number[]} arr + * @returns {number[]} Prefix sum array + * @throws {TypeError} if input is not a numeric array + */ +export const basicPrefixSum = (arr) => { + if (!Array.isArray(arr)) { + throw new TypeError('Input must be an array') + } + + if (!arr.every((item) => typeof item === 'number')) { + throw new TypeError('All elements must be numbers') + } + + const prefix = [] + let sum = 0 + for (const num of arr) { + sum += num + prefix.push(sum) + } + return prefix +} diff --git a/Data-Structures/Array/test/BasicPrefixSum.test.js b/Data-Structures/Array/test/BasicPrefixSum.test.js new file mode 100644 index 0000000000..9042aa05b0 --- /dev/null +++ b/Data-Structures/Array/test/BasicPrefixSum.test.js @@ -0,0 +1,20 @@ +import { describe, it, expect } from 'vitest' +import { basicPrefixSum } from '../BasicPrefixSum.js' + +describe('basicPrefixSum', () => { + it('computes prefix sums correctly', () => { + expect(basicPrefixSum([1, 2, 3, 4])).toEqual([1, 3, 6, 10]) + }) + + it('returns an empty array for empty input', () => { + expect(basicPrefixSum([])).toEqual([]) + }) + + it('throws an error if input is not an array', () => { + expect(() => basicPrefixSum('abc')).toThrow(TypeError) + }) + + it('throws an error if array contains non-numeric elements', () => { + expect(() => basicPrefixSum([1, '2', 3])).toThrow(TypeError) + }) +})