Задачка на олимпиаду С++
В заданном массиве целых чисел нужно вывести только элементы повторяющиеся несколько раз. То есть числа, которые встречаются один раз не выводятся вообще, а из нескольких одинаковых элементов в массиве выбираем один с наименьшим индексом. Если таких элементов нет необходимо вывести сообщение NO.
Входные данные В первой строке записано число N. В следующей строке записано N целых чисел. Все числа по модулю не превышают 100.
Выходные данные Вывести элементы массива, повторяющиеся в одной строке через пробел.
Пример 1:
Входные данные
7
0 1 -2 1 0 0 3
Выходные данные
0 1
Пример 2:
Входные данные
5
-1 -2 0 2 1
Выходные данные
NO
#include <iostream>
using namespace std;
int main() {
int n, number, countt = 0, count[201], mas[201];
cin >> n;
for (int i = 0; i <= 200; i++) {
count[i] = -150;
mas[i] = -150;
}
for (int i = 0; i < n; i++) {
cin >> number;
if (number > 0) {
if (number == 100) {
if (mas[200] != number) {
mas[200] = number;
count[200] = 1;
}
else {
count[200]++;
}
}
else {
if (mas[number + 100] != number) {
mas[number + 100] = number;
count[number + 100] = 1;
}
else {
count[number +100]++;
}
}
}
else if (number < 0) {
if (number == -100) {
if (mas[0] != number) {
mas[0] = number;
count[0] = 1;
}
else {
count[0]++;
}
}
else {
if (100 - mas[abs(number)] != number && count[100 - abs(number)] < 0) {
mas[100 - abs(number)] = number;
count[100 - abs(number)] = 1;
}
else {
count[100 - abs(number)]++;
}
}
}
else {
if (mas[100] != number) {
mas[100] = number;
count[100] = 1;
}
else {
count[100]++;
}
}
}
for (int i = 0; i <= 200; i++) {
if (count[i] > 1) {
cout << mas[i] << " ";
countt++;
}
}
if (countt == 0) {
cout << "NO";
}
return 0;
}
Ответы (1 шт):
А чуть проще не хотите? Так же запоминаем первое появление (по которому потом и сортируем), и счетчик количества. Сортируем, выводим в порядке поступления...
struct item
{
int count, value, idx;
item():value(-1),count(0),idx(-1){}
};
int main()
{
item x[201] = {};
for(int i = 0; i < 201; ++i) x[i].value = i-100;
int N;
cin >> N;
for(int d, i = 0; i < N; ++i)
{
cin >> d;
if (x[d+100].idx < 0) x[d+100].idx = i;
x[d+100].count++;
}
sort(x,x+201,[](const item& a, const item& b){ return a.idx < b.idx;});
bool has = false;
for(int i = 0; i < 201; ++i)
if (x[i].count > 1) { has = true; cout << x[i].value << " "; }
if (!has) cout << "NO";
cout << endl;
}