Если в массиве одно и тоже число встречается несколько раз подряд, то первое его появление оставить
Дан размер массива и сам массив (вводится с клавиатуры)
Если в массиве одно и тоже число встречается несколько раз подряд, то первое его появление оставить, остальные заменить на 0
Пример
8 9 9 9 5 9 3 3 1
Станет
8 9 0 0 5 9 3 0 1
Ответы (4 шт):
По моему, это задача на структуры данных в языке C++.
Фраза "Если в массиве одно и тоже число встречается несколько раз" должна Вас навести на мысль о том, что нужна структура, в которой каждое значение является уникальным.
Для C++ такая структура - это set.
Теперь алгоритм выглядит так:
читаем число.
Если этого числа еще нет в set'е - печатаем число на output
Если есть - печатаем 0.
Одновременно добавляем число в set - это обеспечит печать нуля, если число попадётся нам еще раз.
Нужно привести, как это оформить в коде?
Правда, при таком решении и такой формулировке задачи - пример, приведенный в вопросе, неправильный: девятка должна встречаться в ответе только один раз.
Возможно, Ваша задача проще: нужно просто если два числа подря совпадают, печатать только первое в такой последовательности.
Этого можно добиться, храня предыдущее число, и написав простейший if
#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;
}
Решение довольно простое - достаточно запоминать начало серии
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
Мое решение, основанное на решении 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;
}
