Coding questions · Amazon
Calculate 7-Day Rolling Average for Energy Consumption
This question evaluates programming fluency in numerical data processing and algorithmic implementation for computing moving averages and handling edge cases in time-series sequences, and it applies to Data Scientist roles while falling under the Coding & Algorithms category.
Scenario
Hiring manager wants a quick coding exercise to verify programming fluency.
Question
Write a Python function that takes a list of daily energy consumption values and returns a list containing the 7-day rolling average; handle cases with fewer than 7 observations.
Hints
Use sliding window or collections.deque; O(n) time.
7-Day Rolling Average of Consumption
Given a list of daily energy consumption values (non-negative numbers), return a list of the same length where each element i is the average of the last up to 7 values ending at position i. For the first few days with fewer than 7 observations, use all available observations so far. Return each average rounded to two decimal places. If the input list is empty, return an empty list.
Constraints
- 0 <= len(consumption) <= 200000
- 0 <= consumption[i] <= 1e9
- Output list length equals input list length
- Each average is computed over the last up to 7 elements ending at that index
- Round each average to two decimal places
- Time complexity O(n); extra space O(1) aside from output
Examples
Example 1
Input: consumption = [10, 20, 30, 40, 50, 60, 70]
Output: [10.00, 15.00, 20.00, 25.00, 30.00, 35.00, 40.00]
Explanation: Each day averages the last up to 7 values; by day 7 it becomes the average of all 7 numbers.
Example 2
Input: consumption = [3, 3, 3, 3, 3, 3, 3, 3]
Output: [3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00]
Explanation: All values are equal, so the rolling average remains 3.00 even after the window reaches size 7.
Hints
- Maintain a running sum of the current window and update it in O(1) per step.
- When the window size exceeds 7, subtract the element that falls out from the left.
- Use round(value, 2) to round each average to two decimal places.
Approach
Use a sliding window with a running sum. As you iterate, add the current value to the sum. If the window exceeds 7 elements, subtract the element at the left boundary and move the left boundary forward. The window size is then the number of elements between left and current index inclusive. Compute the average as running_sum/window_size and round to two decimals. This yields O(n) time with O(1) extra space (besides the output).
- Time complexity: O(n)
- Space complexity: O(1) extra (O(n) including output)