要求
对于一个压缩字符串,设计一个数据结构,它支持如下两种操作: next 和 hasNext。
给定的压缩字符串格式为:每个字母后面紧跟一个正整数,这个整数表示该字母在解压后的字符串里连续出现的次数。
- next() - 如果压缩字符串仍然有字母未被解压,则返回下一个字母,否则返回一个空格。
- hasNext() - 判断是否还有字母仍然没被解压。
注意:
请记得将你的类在 StringIterator 中 初始化 ,因为静态变量或类变量在多组测试数据中不会被自动清空。更多细节请访问 这里 。
示例:
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(); // 返回 ' '
核心代码
class StringIterator:
def __init__(self, compressedString: str):
self.char_freq = []
n = len(compressedString)
i = 0
while i < n:
c = compressedString[i]
x = 0
i += 1
while i < n and compressedString[i].isdigit():
x = x * 10 + int(compressedString[i])
i += 1
self.char_freq.append([c,x])
def next(self) -> str:
if not self.char_freq:
return " "
c,f = self.char_freq[0]
if f == 1:
self.char_freq.pop(0)
else:
self.char_freq[0][1] -= 1
return c
def hasNext(self) -> bool:
return len(self.char_freq) != 0
# Your StringIterator object will be instantiated and called as such:
# obj = StringIterator(compressedString)
# param_1 = obj.next()
# param_2 = obj.hasNext()
解题思路:其实就是设置一个数据结构来对压缩字符串进行存储,在init方法中我们将每个字符和后面的数字同构成一个tuple,然后使用一个数据列表进行存储;next就是不断的获取压缩字符,当我们的字符的频率不是0的时候,我们的频率减1,然后我们的输出字符,当频率减为0的时候,我们将字符从数据列表中提取出来,最后的hasNext,就是看数据列表中是否还有数据。