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(); } }