mirror of
https://gitlab.com/mfocko/LeetCode.git
synced 2024-11-09 15:59:06 +01:00
problems: add an RLE Iterator
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
1f5f1bee8c
commit
55ffc32fed
1 changed files with 55 additions and 0 deletions
55
problems/rle-iterator.java
Normal file
55
problems/rle-iterator.java
Normal file
|
@ -0,0 +1,55 @@
|
|||
class RLEIterator {
|
||||
private int[] encoding;
|
||||
private int major = 0;
|
||||
private int minor = 0;
|
||||
|
||||
public RLEIterator(int[] encoding) {
|
||||
this.encoding = encoding;
|
||||
}
|
||||
|
||||
private void nextSegment() {
|
||||
major += 2;
|
||||
minor = 0;
|
||||
}
|
||||
|
||||
private int lastConsumed() {
|
||||
if (major == 0 && minor == 0) {
|
||||
// Haven't consumed anything
|
||||
return -1;
|
||||
} else if (major <= encoding.length && minor == 0) {
|
||||
// Consumed last element of a previous segment
|
||||
return encoding[major - 1];
|
||||
} else if (major >= encoding.length) {
|
||||
// Everything was consumed
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Last consumed from the current segment
|
||||
return encoding[major + 1];
|
||||
}
|
||||
|
||||
public int next(int n) {
|
||||
while (n > 0 && major < encoding.length) {
|
||||
int consumed = Math.min(n, encoding[major] - minor);
|
||||
|
||||
n -= consumed;
|
||||
minor += consumed;
|
||||
|
||||
if (minor == encoding[major]) {
|
||||
nextSegment();
|
||||
}
|
||||
}
|
||||
|
||||
if (n > 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return lastConsumed();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Your RLEIterator object will be instantiated and called as such:
|
||||
* RLEIterator obj = new RLEIterator(encoding);
|
||||
* int param_1 = obj.next(n);
|
||||
*/
|
Loading…
Reference in a new issue