在尝试解决HackerRank的Simple Text Editor
挑战时,我的解决方案只通过了15个测试用例中的3个。由于我无法访问测试用例,因此无法确定代码的确切错误。
我解决问题的方法如下 -
init
字符串(请参阅下面的代码),请在向量的后面按下它的新状态。 [OP_APPEND] init
字符串的新状态。 [OP_DELETE] init
字符串的状态存储在向量的后面,因此在多个UNDO事件的情况下,应使init
字符串与向量的背面同步。 [OP_PRINT& OP_UNDO] 以下是我的实施 -
#include <iostream>
#include <vector>
#include <string>
#define MAX_LEN 1000000
#define MAX_TIMES 100000
using namespace std;
/* Operations supported by editor */
enum EDITOR_OPS {
OP_APPEND = 1,
OP_DELETE,
OP_PRINT,
OP_UNDO
};
/*
* @brief Driver function
*/
int main(int argc, char *argv[])
{
unsigned times; /* Total number of operations */
unsigned option; /* EDITOR_OPS operations */
string init = ""; /* Initial string */
string mystr; /* Temp string */
unsigned num; /* Number used in OP_DELETE & OP_PRINT comms */
vector<string> myvect; /* To hold various states of the editor */
unsigned curr_len = 0; /* Sum of lengths of all characters entered */
cin >> times;
if (times >= 1 && times <= MAX_TIMES) {
for (auto i = 0; i < times; i++) {
cin >> option;
if (option >= 1 && option <= 4) {
if (option == OP_APPEND) {
cin >> mystr;
curr_len += mystr.length();
if (curr_len <= MAX_LEN) {
init.append(mystr);
myvect.push_back(init);
}
}
else if (option == OP_DELETE) {
cin >> num;
if (num >=1 && num <= init.length()) {
init.erase(init.length() - num);
myvect.push_back(init);
}
}
else if (option == OP_PRINT) {
cin >> num;
if (!myvect.empty())
init = myvect.back();
if (num >= 1 && num <= init.length())
cout << init.at(num - 1) << "\n";
}
else if (option == OP_UNDO) {
if (!myvect.empty())
myvect.pop_back();
}
else {
cout << "We should NOT get in here\n";
}
}
}
}
return 0;
}
有人可以帮我弄清楚我的代码和/或我遗失的角落里的错误吗?
答案 0 :(得分:2)
如果撤消然后追加,请考虑代码中发生的情况。
init
包含字符串的当前值。init
,这意味着它与当前状态不匹配。您需要更改上述行为之一。
我怀疑你在测试时总是在一次或多次撤消操作后进行打印。