Given a circular array arr and an integer startIndex, return a generator object gen that yields values from arr.
The first time gen.next() is called on the generator, it should should yield arr[startIndex].
Each subsequent time gen.next() is called, an integer jump will be passed into the function (Ex: gen.next(-3)).
jump is positive, the index should increase by that value, however if the current index is the last index, it should instead jump to the first index.jump is negative, the index should decrease by the magnitude of that value, however if the current index is the first index, it should instead jump to the last index.
Example 1:
Input: arr = [1,2,3,4,5], steps = [1,2,6], startIndex = 0 Output: [1,2,4,5] Explanation: const gen = cycleGenerator(arr, startIndex); gen.next().value; // 1, index = startIndex = 0 gen.next(1).value; // 2, index = 1, 0 -> 1 gen.next(2).value; // 4, index = 3, 1 -> 2 -> 3 gen.next(6).value; // 5, index = 4, 3 -> 4 -> 0 -> 1 -> 2 -> 3 -> 4
Example 2:
Input: arr = [10,11,12,13,14,15], steps = [1,4,0,-1,-3], startIndex = 1 Output: [11,12,10,10,15,12] Explanation: const gen = cycleGenerator(arr, startIndex); gen.next().value; // 11, index = 1 gen.next(1).value; // 12, index = 2 gen.next(4).value; // 10, index = 0 gen.next(0).value; // 10, index = 0 gen.next(-1).value; // 15, index = 5 gen.next(-3).value; // 12, index = 2
Example 3:
Input: arr = [2,4,6,7,8,10], steps = [-4,5,-3,10], startIndex = 3 Output: [7,10,8,4,10] Explanation: const gen = cycleGenerator(arr, startIndex); gen.next().value // 7, index = 3 gen.next(-4).value // 10, index = 5 gen.next(5).value // 8, index = 4 gen.next(-3).value // 4, index = 1 gen.next(10).value // 10, index = 5
Constraints:
1 <= arr.length <= 1041 <= steps.length <= 100-104 <= steps[i], arr[i] <= 1040 <= startIndex < arr.lengthProblem Overview: You need to generate values from an array while treating the array as circular. When the index reaches the end, it wraps back to the beginning. The task is essentially controlled traversal using modular arithmetic so indices never go out of bounds.
Approach 1: Direct Circular Simulation (O(n) time, O(1) space)
The straightforward method is to simulate the traversal while wrapping indices using modulo. Iterate through the required number of steps and compute the next index with (currentIndex + step) % n. This guarantees the index always stays inside the array range while preserving circular behavior. The key insight is that modulo naturally models circular structures, so no extra data structures are needed. This works well for problems involving arrays and simulation patterns.
Approach 2: Mathematical Index Computation (O(n) time, O(1) space)
Instead of explicitly moving step‑by‑step, you can compute the index for each position directly using a formula derived from modular arithmetic. For position i, compute the corresponding circular index using an expression like (start + i * step) % n. This eliminates intermediate state updates and keeps the implementation concise. The algorithm still processes each required value once, resulting in linear time. This technique appears frequently in problems involving modular arithmetic or cyclic traversal.
Recommended for interviews: The direct circular simulation is typically what interviewers expect first. It clearly demonstrates that you understand circular indexing and modulo behavior. After presenting the simulation, pointing out the mathematical formulation shows deeper reasoning about patterns in cyclic sequences.
TypeScript
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Direct Circular Simulation | O(n) | O(1) | Best general solution when generating values step-by-step in a circular structure |
| Mathematical Index Computation | O(n) | O(1) | When the traversal follows a predictable pattern that can be expressed with modular arithmetic |
Product of Array Except Self - Leetcode 238 - Python • NeetCode • 747,485 views views
Watch 9 more video solutions →Practice Generate Circular Array Values with our built-in code editor and test cases.
Practice on FleetCodePractice this problem
Open in Editor