Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1 / 1 / 0
Регистрация: 05.08.2017
Сообщений: 15

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

05.08.2017, 13:12. Показов 40345. Ответов 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
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
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
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
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
Сообщений: 808
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 / 494
Регистрация: 17.11.2018
Сообщений: 2,838
09.06.2026, 22:15
Цитата Сообщение от Igor3D Посмотреть сообщение
50958 dups
Igor3D, так там нужно уникальные искать, а не дубликаты...
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,096
Записей в блоге: 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,096
Записей в блоге: 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
Сообщений: 808
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
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
10.06.2026, 12:23


Вот такого наверное тебе размера массив надо, для хранения данных.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
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
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
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
Закрытая тема Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru