On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 26.08.19 16:38. Заголовок: Количество уникальных элементов и количество пар одинаковых элементов в массиве.


Порой из-за того, что вопрос на Stackoverflow сформулирован начинающим программистом плохо, изначальный ответ на вопрос может решать не ту задачу, которую нужно решить начинающему программисту.

Так получилось и с этим вопросом C++ For Loop got skipped in the middle of the process. How to fix it?

В результате мой ответ содержит решение двух задач вместо одной.

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

Поэтому сначала я понял задачу так, как "найти количество уникальных элементов в массиве".

Предполагается, что исходный массив нельзя изменять. Из чего следует, что нельзя применить сортировку к исходному массиву.

Решить поставленную задачу очень просто с использованием стандартного контейнера std::set или std::unordered_set.

Вот код соответствующей программы.
 
#include <iostream>
#include <set>
#include <iterator>

int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };

size_t total = std::set<int>( std::begin( a ), std::end( a ) ).size();

std::cout << total << '\n';

return 0;
}

Этот подход требует дополнительных ресурсов памяти, так как создается объект класса std::set<int> совместно с заносимыми в него элементами массива.

Если требуется решить задачу без использования дополнительных ресурсов памяти, то можно это сделать с помощью вложенных циклов, как показано ниже.
 
#include <iostream>

int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t total = 0;

for ( size_t i = 0; i < N; i++ )
{
size_t j = 0;

while ( j != i && a[j] != a[ i ] ) j++;

if ( j == i ) ++total;
}

std::cout << total << '\n';

return 0;
}

В обоих случаях вывод на консоль будет
4

так как в массиве, используемом в качестве примера, имеется ровно 4 уникальных элемента.

А как найти количество пар одинаковых элементов (что на самом деле требовалось автору вопроса)?

Опять-таки, это можно сделать двумя способами: с использованием стандартного контейнера и при помощи вложенных циклов.

На этот раз в качестве контейнера будет использовать стандартный контейнер std::map (или можно использовать std::unordered_map) Вот программа, в которой используется контейнер std::map.
 
#include <iostream>
#include <map>

int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
size_t total = 0;

std::map<int, size_t> m;

for ( const auto &item : a ) ++m[item];

for ( const auto &item : m ) total += item.second / 2;

std::cout << total << '\n';

return 0;
}

А эта программа решает ту же самую задачу с помощью вложенных циклов.
 
#include <iostream>

int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t total = 0;

for ( size_t i = 1; i < N; i++ )
{
size_t count = 1;
for ( size_t j = 0; j < i; j++ )
{
if ( a[ i ] == a[j] ) ++count;
}

if ( count % 2 == 0 ) ++total;
}

std::cout << total << '\n';

return 0;
}

На этот раз в обоих случаях вывод на консоль будет
3

так как в массиве содержится ровно 3 пары одинаковых элементов.

Думаю, это хороший учебный пример для начинающих программистов.

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 31
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет