LeetCode in Kotlin

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.

Given a run-length encoded array, design an iterator that iterates through it.

Implement the RLEIterator class:

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:

Solution

@Suppress("NAME_SHADOWING")
class RLEIterator(private val array: IntArray) {
    private var index = 0
    fun next(n: Int): Int {
        var n = n
        var lastElement = -1
        while (n > 0 && index < array.size) {
            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
    }
}

/*
 * Your RLEIterator object will be instantiated and called as such:
 * var obj = RLEIterator(encoding)
 * var param_1 = obj.next(n)
 */