2016-07-11 16 views
-2

Bei dem Versuch zu lösen Simple Text Editor Herausforderung von HackerRank, besteht meine Lösung nur 3 der 15 Testfälle. Da ich keinen Zugriff auf die Testfälle habe, kann ich nicht herausfinden, was genau mit meinem Code falsch ist.

Mein Ansatz zur Lösung des Problems ist, wie unten -
Brauchen Sie Hilfe herauszufinden, Bug in meiner Lösung für einfache Texteditor Herausforderung

  1. einen Vektor Verwenden Sie die verschiedenen Zustände des Editors zu halten.
  2. Wenn wir an die Zeichenfolge init anhängen (siehe Code unten), drücken Sie den neuen Status auf der Rückseite des Vektors. [OP_APPEND]
  3. Im Falle eines Löschvorgangs, drücken Sie den neuen Zustand der init Zeichenfolge auf der Rückseite des Vektors. [OP_DELETE]
  4. Da der Zustand der init Zeichenfolge auf der Rückseite des Vektors gespeichert ist, sollte im Falle mehrerer UNDO-Ereignisse die Zeichenfolge init mit der Rückseite des Vektors synchronisiert werden. [OP_PRINT & OP_UNDO]

Und unten ist meine Implementierung -

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

Könnte jemand bitte helfen Sie mir den Fehler herauszufinden (s) in meinem Code und/oder den Eckfällen ich fehle?

+0

'3. print (k) - drucke das * kth * Zeichen von S' – kfsone

+0

Du solltest 'if (option> = 1 && option <= 4)' entfernen, damit du sehen kannst "Wir sollten NICHT hier reinkommen" wenn etwas nicht stimmt. –

+2

"Da ich keinen Zugriff auf die Testfälle habe, kann ich nicht herausfinden, was genau mit meinem Code nicht stimmt." Wenn Ihr Code nicht funktioniert, ist das Schreiben eigener Testfälle ein hervorragender Ort, um mit dem Debuggen zu beginnen - und so ist es auch bei der Programmierung in der realen Welt. Der Code ist nicht der einzige Weg, um zu debuggen ... –

Antwort

2

Überlegen Sie, was passiert in Ihrem Code, wenn Sie rückgängig machen und dann anhängen.

  • append erwartet, dass den aktuellen Wert der Zeichenfolge enthält.
  • Rückgängig macht nur die letzte Operation rückgängig und lässt init so wie sie ist, was bedeutet, dass sie nicht mit dem aktuellen Zustand übereinstimmt.

Sie müssen eines der oben genannten Verhaltensweisen ändern.

Ich vermute, wenn Sie getestet haben Sie immer einen Druck nach einer oder mehreren Rückgängig-Operationen.