Google – Run Length Encoding Iterator
Run length encoding就是比如aaaabbccc压缩成4a2b3c
题目给一个encoding好的string, 比如4a2b3c,要求写一个iterator来遍历原来的string.
[Solution]
除了iterator一般的edge case以外,这道题还需要注意一些其他的edge case,比如0a2b3c,4a0b3c
Idea就是用一个start pointer指向下一个数字,无论下一个是不是0. 如果当前的cnt用完之后,就从start开始往后找下一个不为0的数字。
Read full article from Google – Run Length Encoding Iterator
Run length encoding就是比如aaaabbccc压缩成4a2b3c
题目给一个encoding好的string, 比如4a2b3c,要求写一个iterator来遍历原来的string.
[Solution]
除了iterator一般的edge case以外,这道题还需要注意一些其他的edge case,比如0a2b3c,4a0b3c
Idea就是用一个start pointer指向下一个数字,无论下一个是不是0. 如果当前的cnt用完之后,就从start开始往后找下一个不为0的数字。
class EncodingIterator implements Iterator<Character> { String s; int cnt; Character c; int start; public EncodingIterator(String s) { if (s == null || s.isEmpty()) { return; } this.s = s; while (cnt == 0) { int i = start; for (; i < s.length(); i++) { if (!Character.isDigit(s.charAt(i))) { break; } } if (i == s.length()) { return; } else { this.cnt = Integer.parseInt(s.substring(start, i)); this.c = s.charAt(i); start = i + 1; } } } @Override public boolean hasNext() { return c != null; } @Override public Character next() { if (c == null) { return null; } Character result = c; this.cnt--; while (cnt == 0) { c = null; int i = start; for (; i < s.length(); i++) { if (!Character.isDigit(s.charAt(i))) { break; } } if (i == s.length()) { break; } else { this.cnt = Integer.parseInt(s.substring(start, i)); this.c = s.charAt(i); start = i + 1; } } return result; }}