Если в массиве одно и тоже число встречается несколько раз подряд, то первое его появление оставить

Дан размер массива и сам массив (вводится с клавиатуры)

Если в массиве одно и тоже число встречается несколько раз подряд, то первое его появление оставить, остальные заменить на 0

Пример
8 9 9 9 5 9 3 3 1

Станет
8 9 0 0 5 9 3 0 1


Ответы (4 шт):

Автор решения: S.H.

По моему, это задача на структуры данных в языке C++.

Фраза "Если в массиве одно и тоже число встречается несколько раз" должна Вас навести на мысль о том, что нужна структура, в которой каждое значение является уникальным.

Для C++ такая структура - это set.

Теперь алгоритм выглядит так:

читаем число.

Если этого числа еще нет в set'е - печатаем число на output

Если есть - печатаем 0.

Одновременно добавляем число в set - это обеспечит печать нуля, если число попадётся нам еще раз.

Нужно привести, как это оформить в коде?

Правда, при таком решении и такой формулировке задачи - пример, приведенный в вопросе, неправильный: девятка должна встречаться в ответе только один раз.

Возможно, Ваша задача проще: нужно просто если два числа подря совпадают, печатать только первое в такой последовательности.

Этого можно добиться, храня предыдущее число, и написав простейший if

→ Ссылка
Автор решения: tomato-magnet-regulato
#include <iostream>

using namespace std;    

int main() {

int n = 0;
cout << "array size : ";
cin >> n;  // ввод размера массива.

int* mass = new int[n]; // создание динамического массива
for (int i = 0; i < n; i++) {
    cin >> mass[i];    // заполнение дин. массива
}

//Каждый элемент сверяем с последующим и если равны, то меняем на 0
for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
        if (mass[i] == mass[j]) {
            mass[j] = 0;
        }
        else {
            break; // На скорую руку, если требуется след. вхождение, убрать этот else если изначально было все верно.
        }
    }
}

// Вывод нового массива.
for (int i = 0; i < n; i++) {
    cout << ' ' << mass[i];
}

delete[] mass; // Очистка памяти(удаление массива)    



return 0;

}

введите сюда описание изображения

→ Ссылка
Автор решения: MBo

Решение довольно простое - достаточно запоминать начало серии

    int n = 9;
    int a[] = { 8, 9, 9, 9, 5, 9, 3, 3, 1};
    int last = a[0];
    for (int i = 1; i < n; i++) {
        if (a[i] == last)
            a[i] = 0;
        else
            last = a[i];
    }
    for (int i = 0; i < n; i++) {
        std::cout << a[i] << " ";
    }

>>> 8 9 0 0 5 9 3 0 1
→ Ссылка
Автор решения: Roman Ozhegov

Мое решение, основанное на решении tomato. Сложность сделана O(n), вместо его O(n^2). Решение оформлено в виде процедуры.

#include <iostream>

using namespace std;

void process (int size, int* mass)
{
    //Каждый элемент сверяем с последующим и если равны, то меняем на 0
    for (int i = size-1; i > 1; i--) {
        if (mass[i-1] == mass[i]) {
            mass[i] = 0;
        }
    }
}

int main() {

    int n = 9;
    int mass[9] = {8, 9, 9, 9, 5, 9, 3, 3, 1};

    process(n, mass);

    // Вывод нового массива.
    for (int i = 0; i < n; i++) {
        cout << ' ' << mass[i];
    }
    cout <<endl;

    return 0;
}
→ Ссылка