Design and implement a data structure for a compressed string iterator. It should support the following operations: next
and hasNext
.
The given compressed string will be in the form of each letter followed by a positive integer representing the number of this letter existing in the original uncompressed string.
next()
- if the original string still has uncompressed characters, return the next letter; Otherwise return a white space.
hasNext()
- Judge whether there is any letter needs to be uncompressed.
Note:
Please remember to RESET your class variables declared in StringIterator, as static/class variables are persisted across multiple test cases. Please see here for more details.
Example:
StringIterator iterator = new StringIterator("L1e2t1C1o1d1e1"); iterator.next(); // return 'L' iterator.next(); // return 'e' iterator.next(); // return 'e' iterator.next(); // return 't' iterator.next(); // return 'C' iterator.next(); // return 'o' iterator.next(); // return 'd' iterator.hasNext(); // return true iterator.next(); // return 'e' iterator.hasNext(); // return false iterator.next(); // return ' '
思路:逐一判断每个字符,遇到是数字的时候就循环前一个字符N次,注意数字有可能是大于10,即不一定是一位数。
代码如下:
package com.billkang;
public class StringIterator {
private String compressedString;
int c = 0;
private int pos = 0;
private char ch;
public StringIterator(String compressedString) {
this.compressedString = compressedString;
}
public char next() {
if (c > 0) {
c--;
return ch;
}
if (pos >= compressedString.length()) {
return ' ';
}
ch = compressedString.charAt(pos++);
while (pos < compressedString.length()
&& isDigit(compressedString.charAt(pos))) {
c = c * 10 + compressedString.charAt(pos++) - '0';
}
c--;
return ch;
}
private boolean isDigit(char charAt) {
return Character.isDigit(charAt);
}
public boolean hasNext() {
return c > 0 || pos < compressedString.length();
}
}