Given an array of integers, you need to return a new array where each element at index i
is the product of all the numbers in the original array except the number at i
. You should aim for an efficient solution that avoids using division.
Input: array = [1, 2, 3, 4]
Output: [24, 12, 8, 6]
Input: array = [0, 1, 2, 3]
Output: [6, 0, 0, 0]
Input: array = [1, 0, 3, 4]
Output: [0, 12, 0, 0]
function computeProductWithoutSelf(nums) {
const n = nums.length;
const result = new Array(n);
// Calculate prefix products
let prefixProduct = 1;
for (let i = 0; i < n; i++) {
result[i] = prefixProduct;
prefixProduct *= nums[i];
}
// Calculate suffix products and combine with prefix products
let suffixProduct = 1;
for (let i = n - 1; i >= 0; i--) {
result[i] *= suffixProduct;
suffixProduct *= nums[i];
}
return result;
}
const array1 = [1, 2, 3, 4];
computeProductWithoutSelf(array1); //output: [24, 12, 8, 6]
const array2 = [0, 1, 2, 3];
computeProductWithoutSelf(array2); //output: [6, 0, 0, 0]
const array3 = [1, 0, 3, 4];
computeProductWithoutSelf(array3); //output: [0, 12, 0, 0]
function calculateProductExcludingSelf(nums) {
const n = nums.length;
const result = new Array(n);
// Calculate prefix products
let prefixProduct = 1;
for (let i = 0; i < n; i++) {
result[i] = prefixProduct;
prefixProduct *= nums[i];
}
// Calculate suffix products and combine with prefix products
let suffixProduct = 1;
for (let i = n - 1; i >= 0; i--) {
result[i] *= suffixProduct;
suffixProduct *= nums[i];
}
return result;
}
const array1 = [1, 2, 3, 4];
calculateProductExcludingSelf(array1); //output: [24, 12, 8, 6]
const array2 = [0, 1, 2, 3];
calculateProductExcludingSelf(array2); //output: [6, 0, 0, 0]
const array3 = [1, 0, 3, 4];
calculateProductExcludingSelf(array3); //output: [0, 12, 0, 0]
function productArrayWithDivision(nums) {
const n = nums.length;
const result = new Array(n);
let totalProduct = 1;
let zeroCount = 0;
// Calculate the total product and count zeros
for (let i = 0; i < n; i++) {
if (nums[i] === 0) {
zeroCount++;
} else {
totalProduct *= nums[i];
}
}
// If more than one zero, all products are zero
if (zeroCount > 1) {
return new Array(n).fill(0);
}
// If exactly one zero, set the product at that position to the total product
if (zeroCount === 1) {
return nums.map(num => num === 0 ? totalProduct : 0);
}
// No zeros, return the product of all elements except self
return nums.map(num => totalProduct / num);
}
const array1 = [1, 2, 3, 4];
productArrayWithDivision(array1); //output: [24, 12, 8, 6]
const array2 = [0, 1, 2, 3];
productArrayWithDivision(array2); //output: [6, 0, 0, 0]
const array3 = [1, 0, 3, 4];
productArrayWithDivision(array3); //output: [0, 12, 0, 0]
function computeProductArrayComparison(nums) {
const n = nums.length;
const result = new Array(n);
let prefixProduct = 1;
for (let i = 0; i < n; i++) {
result[i] = prefixProduct;
prefixProduct *= nums[i];
}
let suffixProduct = 1;
for (let i = n - 1; i >= 0; i--) {
result[i] *= suffixProduct;
suffixProduct *= nums[i];
}
return result;
}
function areArraysEqual(a, b) {
if (!Array.isArray(a) || !Array.isArray(b)) {
throw new Error('Both arguments must be arrays');
}
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) return false;
}
return true;
}
const array1 = [1, 2, 3, 4];
computeProductArrayComparison(array1); //output: [24, 12, 8, 6]
const array2 = [0, 1, 2, 3];
computeProductArrayComparison(array2); //output: [6, 0, 0, 0]
const array3 = [1, 0, 3, 4];
computeProductArrayComparison(array3); //output: [0, 12, 0, 0]