简单的文字编辑器挑战

时间:2016-07-11 00:43:07

标签: c++ algorithm vector stack

在尝试解决HackerRank的Simple Text Editor挑战时,我的解决方案只通过了15个测试用例中的3个。由于我无法访问测试用例,因此无法确定代码的确切错误。

我解决问题的方法如下 -

  1. 使用向量来保存编辑器的不同状态。
  2. 如果我们要附加init字符串(请参阅下面的代码),请在向量的后面按下它的新状态。 [OP_APPEND]
  3. 如果是删除操作,也要在向量的后面推送init字符串的新状态。 [OP_DELETE]
  4. 由于init字符串的状态存储在向量的后面,因此在多个UNDO事件的情况下,应使init字符串与向量的背面同步。 [OP_PRINT& OP_UNDO]
  5. 以下是我的实施 -

    #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;
    }
    

    有人可以帮我弄清楚我的代码和/或我遗失的角落里的错误吗?

1 个答案:

答案 0 :(得分:2)

如果撤消然后追加,请考虑代码中发生的情况。

  • append期望init包含字符串的当前值。
  • 撤消只删除最后一个操作并保持原样init,这意味着它与当前状态不匹配。

您需要更改上述行为之一。

我怀疑你在测试时总是在一次或多次撤消操作后进行打印。