Как удалить 2 последовательных дубликата из массива?C ++ - PullRequest
0 голосов
/ 12 июня 2018

У меня есть массив a={1,2,3,3,2,2,3,3}, и мне нужно удалить дубликаты следующим образом:

1: a={1,2,2,2,3,3}
2: a={1,2,3,3}
3: a={1,2}

Мне нужно удалить 2 последовательных дубликата: (1,2,3,3 будет 1,2), (1,2,2,2 будет 1,2).

Вот моя попытка, но, как вы видите, мне нужна помощь.

#include <iostream>

int main()
{
    int n;
    std::cin >> n;

    int a[n];
    for (int i = 0; i < n; i++)
        std::cin >> a[i];

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

    if (n != 0)
        for (int i = 0; i < n; i++)
            std::cout << a[i] << " ";

    return 0;
}

Моя проблема в том, что я не знаю, как удалить 2 последовательных значения.После нескольких попыток я не могу решить эту проблему.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Если вам просто нужен конечный результат (массив без последовательных дубликатов), тогда вам лучше всего использовать стек и просто пройти весь входной массив один раз, сравнивая значения с вершиной стека и извлекая дубликатыстек.

Если вам нужно распечатывать состояние массива после каждого промежуточного шага, то предложение @ BarronDuBois - это путь.

В любом случае сам код должен быть достаточно простым, я бырад помочь с любой конкретной проблемой.

0 голосов
/ 12 июня 2018

Я не собираюсь писать код для вас, но вот мои мысли.

Сначала напишите функцию, чтобы проверить, существуют ли даже «последовательные дубликаты»:

//returns true if there are no consecutive duplicates within the array, false otherwise
func noConsecDups(arr a)
for int i = 0, i <= a.length-2, i++
if a[i] = a[i++]
return false
end of if
end of loop
return true
end function

Теперь напишите функцию, которая рекурсивно удаляет последовательные дубликаты (возможно, нет необходимости делать это рекурсивно, это только моя первоначальная мысль), проверяя, нужно ли вам вообще удалять какие-либо!

//function that takes an array as input and returns the array with all consecutive duplicates removed
func removeConsecDups(arr a)
if a.length is 1, return a
if a.length is 2 and a[0] != a[1], return a
if(noConsecDups(a)) then there are no consecutive duplicates, return a
otherwise look through the array and just remove the first consecutive duplicates
for int j = 0, j <= a.length-2, j++
if a[j] = a[j+1]
remove a[j+1]
remove a[j]
break
end if statement
end loop
recursively call removeConsecDups(a)
end function
...