2017-02-18 4 views
0

Это текстовый файл, я написал:удаление смежных повторяющихся строк из массива строк?

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 

Я пытаюсь удалить соседние строки дубликаты, так что результат будет:

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

Это то, что я написал до сих пор:

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

это выход я получаю:

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 

Как это исправить? P.S .: Это нужно решать итеративно, поэтому я пытаюсь это сделать.

+0

Каков тип 'arr'? –

+0

Знаете ли вы STL? –

+2

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

ответ

2

Ваша проблема происходит, когда у вас есть более чем в 2 дубликата той же линии. В вашем случае это вызывает проблему.

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

Проблема в том, что вы только дублируете линию один раз со следующим элементом.

Пример: Если у Вас есть 4 строки, в которых линии 1, 2, 3 являются дубликатами, вы бы:

  1. Сравнить 1 с 2, а затем удалить 2, сжимая массив в 1, 3

  2. Вместо сравнения 1 с 3, вы бы пропустить сравнить 3 с 4 (неправильно)

для того, чтобы исправить свое решение, вы должны убедиться, что вы не вкл rement i, пока он не соответствует следующему элементу i+1.

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

Спасибо, что так так вот так так так себе так так много !!!! :) :) :) – Stardust1992

0

Использование std::unique.

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

Извините, я должен был упомянуть, я не могу это использовать. я должен сделать это итеративно. поэтому я пытаюсь это сделать, я тоже не могу использовать рекурсию. – 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];' Это не будет компилироваться вообще. –

+0

Hii Friend, в этой строке, я просто хотел сказать, что старое значение для нового массива .... код не написан для какого-либо конкретного языка ... это просто логика ... –

+0

Спасибо, это тоже работал :) – Stardust1992

Смежные вопросы