1 / 1 / 0
Регистрация: 05.08.2017
Сообщений: 15

Вывести те элементы, которые встречаются в массиве только один раз

05.08.2017, 13:12. Показов 41038. Ответов 199
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Изучаю c++, ломаю уже 1 день голову над данной задачей:
Дан массив. Выведите те его элементы, которые встречаются в массиве только один раз. Элементы нужно выводить в том порядке, в котором они встречаются в списке.

Сделал идею такую: если элемент встречается 1 раз - то вывести его. НО, почему то, выводятся все элементы, день ломаю голову, не могу найти ошибку...

код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <vector>
using namespace std;
int main () {
    int n, numMin = 0, p = 0;
    cin >> n;
    vector <int> num(n);
    for (int i = 0; i < n; i++)
        cin >> num[i];
    for (int i = 0; i < n; i++) {
        int rav = 0;
        for (int i = p; i < n; i++) {
            if (num[numMin] == num[i]) {
                rav++;
            }
        }
        if (rav == 1) {
            cout << num[numMin] << " ";
        }
        numMin++;
        p++;
    }
return 0;
}
Добавлено через 36 минут
На вход получаю:
5
1 3 3 3 2
На выход получаю:
1 3 2 (вместо 1 2)
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2017, 13:12
Ответы с готовыми решениями:

Вывести числа, которые встречаются в массиве несколько раз / один раз
дан массив состоящий из 100 целых чисел. а)Вывести все числа,которие встречаются в етом массиве несколько раз б)Вывести все...

Элементы массива, которые встречаются только один раз
Нужно создать функцию, которая выводит на экран номера элементов, встречающихся в массиве только один раз не знаю как это реализовать...

Удалить нечётные элементы, которые встречаются в массиве один раз
удалить нечетные элементы, которые встречаются в массиве только один раз c++

199
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
09.06.2026, 13:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Наталья8 Посмотреть сообщение
На винде команды приложений выполняються последовательно,
и как то ещё не понятным образом это распаралеливаеться ядрами процессора.
Оно то да, согласен, но часы-то нормально тикают)))

Цитата Сообщение от Алексей1153 Посмотреть сообщение
а у тебя
A = (B==C)
то есть, пропало "защёлкивание" в A единожды появившейся true
Как по мне - всё норм. Переменной А присваивается результат логической операции сравнения 0 или 1. Не пойму, что не так?
На другом компиляторе , думаю бы сработало. Вечером проверю.
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
09.06.2026, 13:57
Тороплюсь, однако, не удержался, проверил по-быстрому, на ардуиновских "плюсах":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void setup() {
 Serial.begin(115200);
 
 int16_t a = 5;
 int16_t b = 7;
 int16_t c = (a == b);
 Serial.println(c);
 b = 5;
 c = (a == b);
 Serial.println(c);
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
Изображения
 
0
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,337
09.06.2026, 14:28
Цитата Сообщение от Димон007 Посмотреть сообщение
Переменной А присваивается результат логической операции сравнения 0 или 1. Не пойму, что не так?
в изначальном варианте хоть раз придёт true - он останется навечно

а в твоём - будет перезаписываться новыми значениями
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
09.06.2026, 17:40
Цитата Сообщение от Алексей1153 Посмотреть сообщение
в изначальном варианте хоть раз придёт true - он останется навечно
Ну я и тупорез)), сам себя запутал. Просто торопился. Именно так и задумано. Спасибо, что поправил.

C
1
IN[i].st |= (IN[i].value  == IN[j].value);
Вот так ещё немного быстрее работает, 2-3 сек.
Миниатюры
Вывести те элементы, которые встречаются в массиве только один раз  
0
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,337
09.06.2026, 18:00
Димон007, st у тебя тут какого типа ?

Но семантически это неправильно, хотя может работать
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
09.06.2026, 18:12
Цитата Сообщение от Алексей1153 Посмотреть сообщение
st у тебя тут какого типа ?
- uint8_t. Неявное приведение типов . Добавил явное, ничего не поменялось.

Для проверки, сразу же подкинул твой вариант,
C
1
2
 //IN[i].st |=(uint8_t)(IN[i].value == IN[k].value);
      IN[i].st = ( IN[i].st || (IN[i].value  == IN[k].value) );
время изменилось, значит работает.
0
-72 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 817
09.06.2026, 18:22
В задаче есть индексы, значения и результат - значение повторяемое или уникальное.
Сначала нам надо вычислить результат, а затем восстановить индексы
(пробежать ещё раз по массиву и глядя на значение и соответствующий ему результат не вывести или вывести).

Для вычисления мы формируем дерево, куда складываем значения и результат.
Дерево нам даёт log(n) на поиск значений и все прочие операции.

Общая сложность n*log(n)
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
09.06.2026, 18:35
Цитата Сообщение от Tupiel Reuschin Посмотреть сообщение
Для вычисления мы формируем дерево, куда складываем значения и результат.
Простейший пример, хотя-бы и на словах, именно для этой конкретной задачи, вразумил бы надёжней, тем более раздел -то для начинающих...)) Мне, к примеру, непонятно, что именно вычислять?
0
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
09.06.2026, 22:15
Цитата Сообщение от Igor3D Посмотреть сообщение
50958 dups
Igor3D, так там нужно уникальные искать, а не дубликаты...
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,149
Записей в блоге: 2
09.06.2026, 22:32
Цитата Сообщение от Димон007 Посмотреть сообщение
Простейший пример, хотя-бы и на словах, именно для этой конкретной задачи, вразумил бы надёжней, тем более раздел -то для начинающих...)) Мне, к примеру, непонятно, что именно вычислять?
Здесь требуется "поиск по ключу", т.е. для каждого элемента (ключ = его значение) нужно дать быстрый ответ встречался ли он ранее. Как Вы убедились, без этого, просто бегая по массиву, время вычислений становится неприемлемо долгим. Это типовая проблема квадратичного перебора (цикл на цикл).

Простейшее/наивное решение - завести таблицу счетчиков и считать значение элемента индексом в этой таблице. Работает очень быстро, но таблица может быть огромной (для больших значений), и нет решения для других, не целых типов, хотя бы флотов.

Стандартная библиотека предоставляет классы для поиска по ключу (ассоциативные контейнеры). Использование std::unordered_map (это хеш) обеспечивает 4 сек на 10 млн элементах - не так уж медленно, а главное - очень легко написать. В общем, перед тем как городить свое - смотрите что уже сделали люди.

Цитата Сообщение от analogov net Посмотреть сообщение
так там нужно уникальные искать, а не дубликаты...
Какой ужас! Неужели все переделывать?
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
09.06.2026, 23:45
Цитата Сообщение от Igor3D Посмотреть сообщение
Простейшее/наивное решение - завести таблицу счетчиков и считать значение элемента индексом в этой таблице. Работает очень быстро
Если эту таблицу создать заранее , для конкретного массива, то тогда всё ясно - но ведь это не про эту задачу?
А если время на создание таблицы входит во время поиска(массив- то рандомный), тогда я видимо пока чего-то не понял.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,149
Записей в блоге: 2
10.06.2026, 00:19
Цитата Сообщение от Димон007 Посмотреть сообщение
Если эту таблицу создать заранее , для конкретного массива, то тогда всё ясно - но ведь это не про эту задачу?
А если время на создание таблицы входит во время поиска(массив- то рандомный), тогда я видимо пока чего-то не понял.
Пример (уже приводился)
C++
1
2
3
4
5
6
7
8
9
10
11
std:vector<int> data = { 0, 100, 100 }; // исходный массив
std:vector<int> tbl(101);  // таблица 101 элемент, нули по умолчанию
 
// подсчитываем число вхождений
for (auto v : data)
 ++tbl[v];
 
// печатаем уникальные
for (auto v : data)
 if (tbl[v] < 2)
  std::cout << v << ", ";
Беда в том что размер таблицы зависит от значения макс элемента (а не от числа элементов) и может оказаться громадным. И работает такая таблица только для целочисленных элементов
C++
1
std:vector<double> data = { 0.0, 100.1, 100.2 }; // какую таблицу создавать?
1
-72 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 817
10.06.2026, 01:36
Цитата Сообщение от Димон007 Посмотреть сообщение
Простейший пример, хотя-бы и на словах, именно для этой конкретной задачи
std::map<long, bool> bOccuredOnce

если true - встретилось один раз.
если false - два и более

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

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

Ещё, в качестве упражнения, можно выполнять на GPU и распараллелить.
Компьютер брать с общей памятью для CPU и GPU
(например ASUS ExpertCenter Pro ET900N G3 (1× GB300 Grace Blackwell Ultra) )
1
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
10.06.2026, 04:21
Цитата Сообщение от Igor3D Посмотреть сообщение
Пример (уже приводился)
Ещё раз извинюсь, что я влез в эту тему(по С++), хотя с "плюсами" почти не знаком(пока только Си учу), лишь когда сталкиваюсь , по ходу разбираюсь,. но, увы, пока ни одной книжки не прочёл, т.к. не дошёл ещё. Поэтому код сразу и не понял.
Вот, разобрался, и, перевёл на более понятный мне язык:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdint.h>
#define MAX_DATA 255u
 
int main()
{
    
    uint8_t data[] = {0, 77, 66, 3, 0, 77, 255};
    uint16_t tabl[MAX_DATA + 1] = {0};
    for(uint16_t i = 0; i < sizeof(data); i++)
    ++tabl[data[i]];//берём значение, как адрес и, считаем 
    //повторения
    printf("Печатаем таблицу tabl...\n");
    for(uint16_t i = 0; i <= MAX_DATA; i++)
    {
    printf(" %d ", tabl[i]);
    if(!((i + 1) % 32))
    printf("\n");
    }
    printf("\nЭлементы с уникальным значением:\n");
    for(uint16_t i = 0; i < sizeof(data); i++)
    if((tabl[data[i]]) < 2)
    printf(" %d ", data[i]);
    
    return 0;
}
Спасибо за объяснения.
Миниатюры
Вывести те элементы, которые встречаются в массиве только один раз  
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
10.06.2026, 04:28
P.S.Проверить, и, сравнить с ранее выложенным примером для 100000 элементов типа uint32_t не удалось, в системе не хватило памяти - bad_alloc

Добавлено через 2 минуты
Цитата Сообщение от Tupiel Reuschin Посмотреть сообщение
std::map<long, bool> bOccuredOnce....
Спасибо за ответ, на досуге посмотрим, разберёмся...
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
10.06.2026, 11:51
Цитата Сообщение от Igor3D Посмотреть сообщение
1
std:vector<double> data = { 0.0, 100.1, 100.2 }; // какую таблицу создавать?
Создать то может и можно, преобразовав double в uint64_t, но я даже для float(uint32_t) не могу создать таблицу, т.к. не хватает памяти

C
1
2
 for(uint32_t i = 0; i < nData; i++)
    ++tabl[*((uint32_t*)(&data[i]))];//представить float как uint32_t
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,292
10.06.2026, 12:23


Вот такого наверное тебе размера массив надо, для хранения данных.
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,292
10.06.2026, 12:31
Цитата Сообщение от Димон007 Посмотреть сообщение
std:vector<double> data = { 0.0, 100.1, 100.2 }; // какую таблицу создавать?
С дублями ни чего не прокатит. Их сравнивать нельзя.
0
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
10.06.2026, 12:33
Цитата Сообщение от Igor3D Посмотреть сообщение
Ну сортировка - операция не дешевая (хотя часто приемлемая). Варианту с мапой она заметно проиграет по скорости
Похоже, в действительности всё с точностью до наоборот:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
10000000 elements in range 0..1000000
  hashmap: 455 unique found in 2368 ms
  sorting: 455 unique found in 793 ms
10000000 elements in range 0..2000000
  hashmap: 67253 unique found in 2578 ms
  sorting: 67253 unique found in 824 ms
10000000 elements in range 0..3000000
  hashmap: 356584 unique found in 2828 ms
  sorting: 356584 unique found in 845 ms
10000000 elements in range 0..10000000
  hashmap: 3676452 unique found in 3526 ms
  sorting: 3676452 unique found in 864 ms
10000000 elements in range 0..2147483647
  hashmap: 9953060 unique found in 5543 ms
  sorting: 9953060 unique found in 850 ms
Вложения
Тип файла: zip test.zip (923 байт, 13 просмотров)
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,292
10.06.2026, 14:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int main()
{
    const int n_count{ 64 };
    int bas_mass[n_count]{};
        std::random_device rd;
    std::mt19937 mersenne(rd());
    std::uniform_int_distribution<int> dist(3, n_count);
    
    for (int i = 0; i < n_count; ++i) {// Заполнил ---------------------
        bas_mass[i] = (int)dist(mersenne);
        printf("%d; ", bas_mass[i]);
        }
    printf("\n\n ------------------------------------\n");
 
int *ptr = bas_mass, *ptr_n = bas_mass;
CMP_N:
    while (1) {
        ++ptr;
    if ( memcmp(ptr_n, ptr, sizeof(int)) == 0) {
        *ptr = -12345; break;
        }
else if (ptr - bas_mass >= n_count-1) {
        if(*ptr_n != -12345)printf("--- %d\n", *ptr_n); break; }
        }
    ++ptr_n;
if ((ptr_n - bas_mass) < n_count) { ptr = ptr_n;
 goto CMP_N; }
 
getchar();
}
Вот нате ещё почитайте... Довольно короткий алгоритм. Я мерять не стану.
Находит первый повтор, ставит вместо него волшебное число
и вылетает дальше на след. позишен. Ни чего не аккомулирует.
С переду ни чего не читает.
(Кто грамотный?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2026, 14:03

Создать функцию, определяющую номера элементов, которые встречаются в массиве только один раз
Создать функцию, определяющую номера элементов, которые встречаются в массиве только один раз.С++

Вывести только те слова сообщения, которые встречаются в тексте один раз
Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация, разделенная пробелами и знаками препинани, в конце которого...

Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация, разделенная пробелами и знаками препинани, в конце которого...

Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Вывести только те слова сообщения, которые встречаются в нем ровно один раз. Помогите исправить ошибку в коде. #include...

Вывести в файл буквы исходного файла, которые встречаются только один раз
Имеются 2 файла В первом находятся все буквы русского алфавита Залкча:Сгенерировать во 2ой файл буквы из 1го файла без повтора ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Закрытая тема Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru