Bird
Raised Fist0
DSA Cprogramming~10 mins

Trapping Rain Water Problem in DSA C - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to declare the array size variable for the heights array.

DSA C
int height[] = {0,1,0,2,1,0,1,3,2,1,2,1};
int n = [1];
Drag options to blanks, or click blank then click option'
Asizeof(height) / sizeof(height[0])
Bsizeof(height)
Clength(height)
Dcount(height)
Attempts:
3 left
💡 Hint
Common Mistakes
Using sizeof(height) alone gives total bytes, not element count.
Using length() or count() which are not valid in C.
2fill in blank
medium

Complete the code to initialize the left max array first element.

DSA C
int leftMax[n];
leftMax[0] = [1];
Drag options to blanks, or click blank then click option'
A0
Bn
Cheight[1]
Dheight[0]
Attempts:
3 left
💡 Hint
Common Mistakes
Initializing leftMax[0] to 0 instead of height[0].
Using height[1] which is the wrong index.
3fill in blank
hard

Fix the error in the loop that fills the right max array from the right side.

DSA C
int rightMax[n];
rightMax[n-1] = height[n-1];
for (int i = n-2; i >= 0; i--) {
    rightMax[i] = [1];
}
Drag options to blanks, or click blank then click option'
Aheight[i] < rightMax[i+1] ? height[i] : rightMax[i+1]
BrightMax[i+1]
Cheight[i] > rightMax[i+1] ? height[i] : rightMax[i+1]
Dheight[i]
Attempts:
3 left
💡 Hint
Common Mistakes
Using less than comparison instead of greater than.
Assigning only height[i] or rightMax[i+1] without comparison.
4fill in blank
hard

Fill both blanks to calculate trapped water at each index and add to total.

DSA C
int water = 0;
for (int i = 0; i < n; i++) {
    water += ([1] < [2] ? [1] : [2]) - height[i];
}
Drag options to blanks, or click blank then click option'
AleftMax[i]
BrightMax[i]
Cheight[i]
Dwater
Attempts:
3 left
💡 Hint
Common Mistakes
Using height[i] instead of leftMax or rightMax in min calculation.
Subtracting wrong values or adding height instead of subtracting.
5fill in blank
hard

Fill all three blanks to complete the trapping rain water function.

DSA C
int trap(int* height, int n) {
    int leftMax[n], rightMax[n];
    leftMax[0] = [1];
    for (int i = 1; i < n; i++) {
        leftMax[i] = (height[i] > leftMax[i-1]) ? height[i] : leftMax[i-1];
    }
    rightMax[n-1] = [2];
    for (int i = n-2; i >= 0; i--) {
        rightMax[i] = (height[i] > rightMax[i+1]) ? height[i] : rightMax[i+1];
    }
    int water = 0;
    for (int i = 0; i < n; i++) {
        water += ([3] < rightMax[i] ? [3] : rightMax[i]) - height[i];
    }
    return water;
}
Drag options to blanks, or click blank then click option'
Aheight[0]
Bheight[n-1]
CleftMax[i]
DrightMax[i]
Attempts:
3 left
💡 Hint
Common Mistakes
Initializing leftMax or rightMax with wrong indices.
Using wrong variables in water calculation.

Practice

(1/5)
1. What does the Trapping Rain Water problem aim to find given an array of heights?
easy
A. The minimum height of the bars
B. The maximum height of the bars
C. The number of bars in the array
D. The total amount of water trapped between the bars after raining

Solution

  1. Step 1: Understand the problem context

    The problem involves an array representing heights of bars where water can be trapped between them.
  2. Step 2: Identify the goal

    The goal is to calculate how much water can be trapped after raining between these bars.
  3. Final Answer:

    The total amount of water trapped between the bars after raining -> Option D
  4. Quick Check:

    Trapping Rain Water = Total trapped water [OK]
Hint: Think of bars as walls holding water in between [OK]
Common Mistakes:
  • Confusing trapped water with bar heights
  • Calculating max or min height instead of trapped water
  • Ignoring the space between bars
2. Which of the following C code snippets correctly declares an array to store bar heights for the Trapping Rain Water problem?
easy
A. int heights[] = {4, 2, 0, 3, 2, 5};
B. int heights = {4, 2, 0, 3, 2, 5};
C. int heights[6] = (4, 2, 0, 3, 2, 5);
D. int heights[6] = [4, 2, 0, 3, 2, 5];

Solution

  1. Step 1: Check array declaration syntax in C

    Arrays are declared with type, name, and initializer list in braces {}.
  2. Step 2: Validate each option

    int heights[] = {4, 2, 0, 3, 2, 5}; uses correct syntax: int heights[] = {4, 2, 0, 3, 2, 5}; Options A, B, D have syntax errors.
  3. Final Answer:

    int heights[] = {4, 2, 0, 3, 2, 5}; -> Option A
  4. Quick Check:

    Correct C array syntax = int heights[] = {4, 2, 0, 3, 2, 5}; [OK]
Hint: Use braces {} to initialize arrays in C [OK]
Common Mistakes:
  • Using parentheses () instead of braces {}
  • Missing array size or incorrect initializer syntax
  • Using square brackets [] for initialization
3. What is the output of the following C code snippet that calculates trapped water?
int heights[] = {3, 0, 2, 0, 4};
int n = 5;
int left_max[5], right_max[5];
int water = 0;

// Calculate left max
left_max[0] = heights[0];
for (int i = 1; i < n; i++) {
    left_max[i] = (heights[i] > left_max[i-1]) ? heights[i] : left_max[i-1];
}

// Calculate right max
right_max[n-1] = heights[n-1];
for (int i = n-2; i >= 0; i--) {
    right_max[i] = (heights[i] > right_max[i+1]) ? heights[i] : right_max[i+1];
}

// Calculate trapped water
for (int i = 0; i < n; i++) {
    water += (left_max[i] < right_max[i] ? left_max[i] : right_max[i]) - heights[i];
}

printf("%d\n", water);
medium
A. 4
B. 6
C. 7
D. 5

Solution

  1. Step 1: Calculate left_max and right_max arrays

    left_max = [3, 3, 3, 3, 4], right_max = [4, 4, 4, 4, 4]
  2. Step 2: Calculate trapped water at each index

    Water trapped = sum of min(left_max[i], right_max[i]) - heights[i] = (3-3)+(3-0)+(3-2)+(3-0)+(4-4) = 0+3+1+3+0 = 7
  3. Final Answer:

    7 -> Option C
  4. Quick Check:

    Sum trapped water = 7 [OK]
Hint: Use left_max and right_max arrays to find trapped water fast [OK]
Common Mistakes:
  • Mixing up left_max and right_max arrays
  • Forgetting to subtract heights from min of max arrays
  • Off-by-one errors in loops
4. Identify the bug in this C code snippet for calculating trapped rain water:
int trap(int* height, int heightSize) {
    int left_max[heightSize];
    int right_max[heightSize];
    int water = 0;

    left_max[0] = height[0];
    for (int i = 1; i < heightSize; i++) {
        left_max[i] = height[i] > left_max[i-1] ? height[i] : left_max[i-1];
    }

    right_max[heightSize-1] = height[heightSize-1];
    for (int i = heightSize-2; i >= 0; i--) {
        right_max[i] = height[i] > right_max[i+1] ? height[i] : right_max[i+1];
    }

    for (int i = 0; i < heightSize; i++) {
        water += (left_max[i] < right_max[i] ? left_max[i] : right_max[i]) - height[i];
    }

    return water;
}
medium
A. Incorrect comparison operator in left_max calculation
B. Using variable length arrays (VLA) which may not be supported
C. Wrong loop range in right_max calculation
D. Missing initialization of water variable

Solution

  1. Step 1: Analyze array declarations

    The code uses int left_max[heightSize]; and int right_max[heightSize]; which are variable length arrays (VLA).
  2. Step 2: Understand VLA support in C

    VLAs are optional in C11 and may not be supported by all compilers, causing portability issues or errors.
  3. Final Answer:

    Using variable length arrays (VLA) which may not be supported -> Option B
  4. Quick Check:

    VLAs may cause errors = Using variable length arrays (VLA) which may not be supported [OK]
Hint: Avoid VLAs; use dynamic memory or fixed size arrays [OK]
Common Mistakes:
  • Assuming VLAs always work in all C compilers
  • Ignoring compiler warnings about VLAs
  • Confusing VLA issue with logic errors
5. Given the heights array {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}, what is the total trapped rain water using the two-pointer approach in C?
hard
A. 6
B. 5
C. 7
D. 8

Solution

  1. Step 1: Understand two-pointer approach

    Use two pointers left and right starting at ends, track left_max and right_max, move pointers inward calculating trapped water.
  2. Step 2: Dry run the array

    Heights: [0,1,0,2,1,0,1,3,2,1,2,1] Water trapped = 6 units after calculating min(left_max, right_max) - height at each step.
  3. Final Answer:

    6 -> Option A
  4. Quick Check:

    Two-pointer trapped water = 6 [OK]
Hint: Use two pointers and track max heights from both ends [OK]
Common Mistakes:
  • Not updating left_max and right_max correctly
  • Moving pointers incorrectly causing missed water
  • Confusing two-pointer with prefix arrays method
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard