All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0801_0900.s0900_rle_iterator.RLEIterator Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0801_0900.s0900_rle_iterator;

// #Medium #Array #Design #Counting #Iterator #2022_03_28_Time_3_ms_(100.00%)_Space_41.8_MB_(96.19%)

/**
 * 900 - RLE Iterator\.
 *
 * Medium
 *
 * We can use run-length encoding (i.e., **RLE** ) to encode a sequence of integers. In a run-length encoded array of even length `encoding` ( **0-indexed** ), for all even `i`, `encoding[i]` tells us the number of times that the non-negative integer value `encoding[i + 1]` is repeated in the sequence.
 *
 * *   For example, the sequence `arr = [8,8,8,5,5]` can be encoded to be `encoding = [3,8,2,5]`. `encoding = [3,8,0,9,2,5]` and `encoding = [2,8,1,8,2,5]` are also valid **RLE** of `arr`.
 *
 * Given a run-length encoded array, design an iterator that iterates through it.
 *
 * Implement the `RLEIterator` class:
 *
 * *   `RLEIterator(int[] encoded)` Initializes the object with the encoded array `encoded`.
 * *   `int next(int n)` Exhausts the next `n` elements and returns the last element exhausted in this way. If there is no element left to exhaust, return `-1` instead.
 *
 * **Example 1:**
 *
 * **Input**
 *
 * ["RLEIterator", "next", "next", "next", "next"]
 *
 * [[[3, 8, 0, 9, 2, 5]], [2], [1], [1], [2]]
 *
 * **Output:** [null, 8, 8, 5, -1]
 *
 * **Explanation:**
 *
 *     RLEIterator rLEIterator = new RLEIterator([3, 8, 0, 9, 2, 5]); // This maps to the sequence [8,8,8,5,5].
 *     rLEIterator.next(2); // exhausts 2 terms of the sequence, returning 8. The remaining sequence is now [8, 5, 5].
 *     rLEIterator.next(1); // exhausts 1 term of the sequence, returning 8. The remaining sequence is now [5, 5].
 *     rLEIterator.next(1); // exhausts 1 term of the sequence, returning 5. The remaining sequence is now [5].
 *     rLEIterator.next(2); // exhausts 2 terms, returning -1. This is because the first term exhausted was 5,
 *     // but the second term did not exist. Since the last term exhausted does not exist, we return -1. 
 *
 * **Constraints:**
 *
 * *   `2 <= encoding.length <= 1000`
 * *   `encoding.length` is even.
 * *   0 <= encoding[i] <= 109
 * *   1 <= n <= 109
 * *   At most `1000` calls will be made to `next`.
**/
@SuppressWarnings("java:S135")
public class RLEIterator {
    private int index;
    private final int[] array;

    public RLEIterator(int[] encoding) {
        index = 0;
        array = encoding;
    }

    public int next(int n) {
        int lastElement = -1;
        while (n > 0 && index < array.length) {
            if (array[index] > n) {
                array[index] -= n;
                lastElement = array[index + 1];
                break;
            } else if (array[index] == n) {
                array[index] = 0;
                lastElement = array[index + 1];
                index += 2;
                break;
            } else {
                n -= array[index];
                index += 2;
            }
        }
        return lastElement;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy