Advertisement
Home Data Structure Arrays Product of Non-Zero Elements in an Array

Product of Non-Zero Elements in an Array

0
Advertisement

Title: Product of Non-Zero Elements in an Array

In this guide, you’ll learn how to compute the product of all non-zero elements in a Java integer array. The problem looks small, but it packs several interview-worthy sub-questions: what should the method return when the array contains only zeros, how do you keep the running product safe from overflow, and how do you handle negative values and null inputs cleanly.

We’ll walk through the problem statement, a reference implementation, a step-by-step trace, worked examples, and the common pitfalls to avoid before closing with follow-up questions an interviewer is likely to ask next.

Understanding the Problem

Given an array of integers, multiply only those elements that are not equal to zero and return the result as a long. Zeros are skipped so that a single 0 in the array does not force the whole product to collapse to zero.

If every element happens to be zero, there is no non-zero contribution to multiply, so returning 0 is the natural signal that the array had nothing to accumulate. The result can grow large even for modest inputs, so we use a long accumulator even though the input is int.

Approach and Algorithm Steps

The algorithm is a single linear scan with two pieces of state: the running product and a flag that remembers whether we have seen a non-zero element.

  1. Validate the input and reject null or empty arrays with an IllegalArgumentException.
  2. Initialize a long accumulator product to 1 and a boolean flag sawNonZero to false.
  3. Iterate through every element of the array with an enhanced for loop.
  4. Skip the element when it equals 0; otherwise multiply it into product and set sawNonZero to true.
  5. After the loop, if sawNonZero is still false, return 0 because the array contained no non-zero elements.
  6. Otherwise return the accumulated product.

Java Program

Java
public class ProductOfNonZeroElements {

    public static long productOfNonZero(int[] numbers) {
        if (numbers == null) {
            throw new IllegalArgumentException("Input array must not be null");
        }
        if (numbers.length == 0) {
            throw new IllegalArgumentException("Input array must not be empty");
        }
        long product = 1L;
        boolean sawNonZero = false;
        for (int value : numbers) {
            if (value != 0) {
                product *= value;
                sawNonZero = true;
            }
        }
        if (!sawNonZero) {
            return 0L;
        }
        return product;
    }

    public static void main(String[] args) {
        int[] numbers = {4, 0, 2, 5, 0, 3};
        long result = productOfNonZero(numbers);
        System.out.println("Product of non-zero elements: " + result);
    }
}

Explanation of the Program

The method productOfNonZero accepts an int[], rejects null and empty inputs up front, and then declares a long variable product initialized to 1. Starting the accumulator at 1 is deliberate: 1 is the identity for multiplication, so the first real value sets the product correctly. Starting at 0 would collapse every future product.

The sawNonZero flag distinguishes “the array contained only zeros” from “the product happens to be 1”. Without the flag, inputs like {0, 0, 0} and {1} would both leave product == 1 and the caller could not tell them apart.

The enhanced for loop walks every element exactly once. Inside the body, the guard value != 0 protects both the multiplication and the flag update, so skipped zeros contribute nothing and leave the running state unchanged.

After the loop, if sawNonZero is still false, the method returns 0L. Otherwise, it returns the accumulated product, letting the caller observe both the sign and the magnitude of the final result.

Step-by-Step Trace

Consider the input {-3, 0, 4, -1, 2}. The expected result is 24 because the non-zero factors are -3, 4, -1, and 2.

IterationvalueZero?product (before)product (after)sawNonZero
1-3no1-3true
20yes-3-3true
34no-3-12true
4-1no-1212true
52no1224true

At the end of iteration i, product holds the product of all non-zero elements in numbers[0..i] and sawNonZero is true if any non-zero element has been seen so far.

Examples

The next three snippets exercise the three shapes of input the method should handle gracefully.

Example 1: Mixed Zeros and Positives

Zeros interleave with four positive factors. The method skips both zeros and multiplies the remaining values: 4 * 2 * 5 * 3 = 120.

Java
int[] numbers = {4, 0, 2, 5, 0, 3};
long result = productOfNonZero(numbers);
System.out.println(result);
// Output: 120

Example 2: Negative Values with a Zero

Two negatives make a positive. The zero in the middle is skipped and the final product is (-2) * 3 * (-5) = 30.

Java
int[] numbers = {-2, 3, 0, -5};
long result = productOfNonZero(numbers);
System.out.println(result);
// Output: 30

Example 3: All Zeros

Every element is zero, so no multiplications take place. The sawNonZero flag stays false and the method returns 0 to signal that nothing was multiplied.

Java
int[] numbers = {0, 0, 0};
long result = productOfNonZero(numbers);
System.out.println(result);
// Output: 0

Common Mistakes to Avoid

These misreadings of the problem produce bugs that surface on specific inputs rather than at compile time, so they are the ones worth internalizing early.

  • Initializing product to 0 – every multiplication keeps the accumulator at zero, so the method returns 0 for every input regardless of content. Initialize product = 1L, since 1 is the identity for multiplication.
  • Omitting the zero skip – without the if (value != 0) guard the first zero in the array wipes out the running product and the result is always 0 whenever any zero is present. Keep the explicit zero skip so zeros contribute nothing.
  • Using int for the product – inputs like {1000, 1000, 1000, 1000} overflow a 32-bit accumulator and return a garbage negative value. Store the running product in a long declared as long product = 1L.
  • Returning 1 for an all-zero array – without the sawNonZero flag, {0, 0, 0} is indistinguishable from a product-of-1 case and callers cannot tell them apart. Track a flag and return 0 when the array has no non-zero elements.
  • Early return on the first zero – treating a zero as a terminator makes the method miss the non-zero elements after it, so {3, 0, 4} wrongly reports 3 instead of 12. Zeros are skipped silently, not treated as end-of-input.

Edge Cases to Test

Walk through this short checklist before you call the implementation done.

  • Empty array
  • Null array reference
  • Single-element non-zero array
  • Array containing only zeros
  • Array of all negative numbers
  • Single non-zero element surrounded by zeros
  • Values near Integer.MAX_VALUE that could overflow the long product
  • Mixed positive and negative values with an odd negative count

Additional Considerations

The method runs in O(n) time where n is the array length, since every element is inspected exactly once and the work per element is constant. Space complexity is O(1) because only the accumulator and the flag are kept outside the input itself.

Overflow is the main implementation risk. Promoting the accumulator to long buys 32 extra bits of head room, enough to hold products up to roughly 9.2 * 10^18 before wraparound, but adversarial inputs can still exceed that. For untrusted inputs consider java.math.BigInteger, which trades constant-time multiplication for arbitrary precision.

The sign of the final product is determined by the parity of the negative factors: an even count of negatives yields a positive product and an odd count yields a negative one. Zeros do not influence the sign because they are skipped before the multiplication happens.

Interview Follow-up Questions

Interviewers tend to layer these variants on top of the base solution to probe how far the candidate’s model stretches.

  • How would you detect overflow before it corrupts the result? – use Math.multiplyExact(product, value) inside the loop so the JVM throws an ArithmeticException instead of silently wrapping around on overflow.
  • What if you need the product of non-zero elements modulo a prime p? – take the product modulo p after each multiplication; the modulo operation sidesteps overflow entirely while preserving the answer under the modulus.
  • What if the running product can exceed the range of long? – swap the long accumulator for java.math.BigInteger and accept the extra per-multiplication cost, which depends on the digit length rather than being constant.
  • How would you parallelize this across many threads for a billion-element array? – partition the array into chunks, compute the product of non-zero elements per chunk in parallel, then multiply the partial products together in a final serial step.
  • How would you adapt the method to report how many zeros were skipped? – return a small result object or a two-element long[] carrying both the running product and a zero counter, so callers can distinguish absent factors from skipped ones.

Conclusion

The product of non-zero elements problem is a compact exercise in defensive coding and iterative multiplication. Once you internalize the identity-value initialization, the explicit zero skip, and the all-zero sentinel, the same template transfers directly to sums of non-zero elements, products modulo a prime, or any aggregate that must ignore specific inputs.

Try adapting the code to compute the product of only positive numbers, the product of only even values, or the sum of absolute values; most of the scaffolding stays the same. You can learn more about array problems here: Arrays.