2017-02-18 6 views
0

Dies ist die Textdatei hat ich geschrieben:benachbarte doppelte Zeichenfolgen aus einem Array von Zeichenfolgen entfernen?

this is the first line 
this is the first line 
this is the second line 
this is the second line 
this is the second line 
this is the third line 
this is the first line 

Ich versuche, die benachbarten doppelten Strings zu entfernen, so wäre die Ausgabe:

this is the first line 
this is the second line 
this is the third line 
this is the first line 

Das ist, was ich bisher geschrieben habe:

for(int i = 0; i < n; i++) 
getline(infile,arr[i]); 

for(int i=0; i<n; i++) 
{ 
     int j = i+1; 
     if(arr[i] == arr[j]) 
     { 
       for(int k = i; k<n; k++) 
       arr[k] = arr[k+1]; 
       n--; 
     } 
} 

dies ist die Ausgabe erhalte ich:

this is the first line 
this is the second line 
this is the second line 
this is the third line 
this is the first line 

Wie behebt man das? P.S .: Es muss iterativ gelöst werden, weshalb ich es auf diese Weise versuche.

+0

Was ist der Typ von 'arr'? –

+0

Kennen Sie STL? –

+2

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

Antwort

2

Ihr Problem tritt auf, wenn Sie mehr als 2 Duplikate der gleichen Zeile haben. In Ihrem Fall verursacht dies das Problem.

this is the second line 
this is the second line 
this is the second line 

Das Problem besteht darin, dass Sie die Zeile nur einmal mit dem nächsten Element duplizieren.

Beispiel: Wenn Sie 4 Zeilen aufweisen, in den Linien 1, 2, 3 sind Duplikate, würden Sie:

  1. 1 Vergleich mit 2, und dann 2 entfernen, Komprimieren des Array auf 1, 3

  2. Stattdessen 1 mit 3 zu vergleichen, würde überspringen Sie 3 mit 4 (falsch)

um vergleichen Sie Ihre Lösung zu beheben, müssen Sie sicher, dass Sie inc nicht machen rement i, bis es nicht mit dem nächsten Element i+1 übereinstimmt.

i = 0; 
while (i < n) 
{ 
    int j = i+1; 
    if(arr[i] == arr[j]) 
    { 
     for(int k = i; k<n; k++) 
     { 
      arr[k] = arr[k+1]; 
     } 
     n--; 
    } 
    else 
    { 
     i++; 
    } 
} 
+0

Vielen Dank also so so so so so so so so sehr !!!! :) :) :) – Stardust1992

0

Verwenden Sie std::unique.

auto end = std::unique(std::begin(arr), std::end(arr)); 
+0

Entschuldigung, ich hätte erwähnen sollen, ich kann das nicht benutzen. Ich muss es iterativ tun. weshalb ich es auf diese Weise versuche, kann ich Rekursion auch nicht verwenden. – Stardust1992

0
for(int i=0; i < count(original_array); i++) 
{ 
    if(i == 0) // check for first entry 
    { 
     new_array[] = original_array[i]; 
     temp = original_array[i]; 
    } 
    if(temp != original_array[i]) // check thereafter 
    { 
     new_array[] = original_array[i]; 
     temp = original_array[i]; 
    } 
} 
+0

'new_array [] = original_array [i];' Dies wird überhaupt nicht kompiliert. –

+0

Hii Freund, in dieser Zeile wollte ich nur sagen, den alten Wert auf neue Array setzen .... der Code ist nicht für eine bestimmte Sprache geschrieben ... es ist nur eine Logik ... –

+0

Vielen Dank, es hat auch funktioniert :) – Stardust1992

Verwandte Themen