题目来源
题目描述
class StringIterator{
public:
StringIterator(string compressedString){
}
char next(){
}
bool hasNext(){
}
private:
};
题目解析
分析
- 这道题本质上是要我们根据压缩字符串来输出原字符串中的所有字符
- 那么我们需要提取出每一个字符,以及它们的出现次数
- 次数减1,如果减到0了,我们就要取出下一个字符和其出现的次数。
实现
class StringIterator{
public:
StringIterator(string compressedString){
s = compressedString;
n = s.size();
c = ' ';
cnt = 0;
i = 0;
}
char next(){
if(hasNext()){
--cnt;
return c;
}
return ' ';
}
bool hasNext(){
if (cnt > 0) return true;
if (i >= n) return false;
c = s[i++];
while (i < n && s[i] >= '0' && s[i] <= '9') {
cnt = cnt * 10 + s[i++] - '0';
}
return true;
}
private:
std::string s; // 保存原字符串
int n, i, cnt; // i来记录当前遍历到的位置,变量c为当前处理的字符,变量cnt为字符c的当前次数
char c;
};
C++中的字符流类来处理字符串:
class StringIterator{
public:
StringIterator(string compressedString){
is = istringstream (compressedString);
cnt = 0;
c = ' ';
}
char next(){
if (hasNext()) {
--cnt;
return c;
}
return ' ';
}
bool hasNext(){
if(cnt == 0){
is >> c >> cnt;
}
return cnt > 0;
}
private:
istringstream is;
int cnt;
char c;
};
下面这种解法还是用字符流类,和上面方法不同的地方是,在构建函数中完成了所有字符和次数的拆分:
class StringIterator {
public:
StringIterator(string compressedString) {
istringstream is(compressedString);
int cnt = 0;
char c = ' ';
while (is >> c >> cnt) {
q.push({c, cnt});
}
}
char next() {
if (hasNext()) {
auto &t = q.front();
if (--t.second == 0) q.pop();
return t.first;
}
return ' ';
}
bool hasNext() {
return !q.empty();
}
private:
queue<pair<char, int>> q;
};