我应该编写一个程序,其中包含“pre#ogrann ## mmink#g”之类的字符串并返回“编程”,就像你的退格按钮被打破一样,当你点击它时你会得到'#'而不是擦掉掉的小屋,我必须修理它。我在这里有工作代码,但它是慢的方式,我可能不得不处理大字符串,任何建议我怎么能更好/更快地做到这一点?
#include <string>
#include <iostream>
using namespace std;
int main() {
string str;
while(cin >> str) {
bool done = false;
while(!done) {
if((int)str.find('#')>-1) {
str.erase(str.find('#')-1, 2);
} else {
done = true;
}
}
cout << str << endl;
}
}
答案 0 :(得分:3)
这是我将如何做到的。我没有对它进行测试以确定它是否实际上更快,但由于它具有 O(N)的复杂性,我认为它应该足够快:
while (std::cin >> input) {
std::string result;
result.reserve(input.length());
for (auto ch : input) {
if (ch == '#') {
if (result.length() > 0)
result.pop_back();
continue;
}
result += ch;
}
std::cout << result << '\n';
}
答案 1 :(得分:0)
#include <iostream>
#include <string>
using namespace std;
string s = "pre#ogrann##mmink#g";
int main() {
string out;
int len = s.length();
for (int i = 0; i < len; i++) {
if(s[i] == '#') {
s.erase(i-1,2);
len = s.length();
i -= 2;
}
}
cout << s;
return 0;
}
这会产生一个工作输出。