LeetCode刷题实战604:迭代压缩字符串
示例:
StringIterator iterator = new StringIterator(“L1e2t1C1o1d1e1”);
iterator.next(); // 返回 ‘L’
iterator.next(); // 返回 ‘e’
iterator.next(); // 返回 ‘e’
iterator.next(); // 返回 ‘t’
iterator.next(); // 返回 ‘C’
iterator.next(); // 返回 ‘o’
iterator.next(); // 返回 ‘d’
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 ‘e’
iterator.hasNext(); // 返回 false
iterator.next(); // 返回 ’ ’
解题
https://blog.csdn.net/qq_29051413/article/details/108679703
class StringIterator {
private String res; // 压缩的字符串;
private char ch = ' '; // 当前字符
private int num = 0; // 当前字符的剩余数量
private int ptr = 0;
public StringIterator(String s) {
res = s;
}
public char next() {
// 没有下一个字符了
if (!hasNext()) return ' ';
// 当前字符数量为 0,但是还有下一个字符
if (num == 0) {
ch = res.charAt(ptr++); // ch 更新为新的字符,++放在变量后面,属于先用后加
// 统计新的字符后面的数字
while (ptr < res.length() && Character.isDigit(res.charAt(ptr))) {
// res.charAt(ptr++) - '0' 等效于字符转数字
num = num * 10 + res.charAt(ptr++) - '0';
}
}
num--; // 返回一个,数量减一
return ch;
}
public boolean hasNext() {
return ptr != res.length() || num != 0;
}
}