Форум » C/C++ для начинающих (C/C++ for beginners) » Количество уникальных элементов и количество пар одинаковых элементов в массиве. » Ответить

Количество уникальных элементов и количество пар одинаковых элементов в массиве.

Сыроежка: Порой из-за того, что вопрос на Stackoverflow сформулирован начинающим программистом плохо, изначальный ответ на вопрос может решать не ту задачу, которую нужно решить начинающему программисту. Так получилось и с этим вопросом C++ For Loop got skipped in the middle of the process. How to fix it? В результате мой ответ содержит решение двух задач вместо одной. Из кода программы, которая не имеет большого смысла, проведенного в вопросе, трудно понять, что на самом деле начинающий программист пытается сделать. Поэтому сначала я понял задачу так, как "найти количество уникальных элементов в массиве". Предполагается, что исходный массив нельзя изменять. Из чего следует, что нельзя применить сортировку к исходному массиву. Решить поставленную задачу очень просто с использованием стандартного контейнера std::set или std::unordered_set. Вот код соответствующей программы. [pre2] #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; }[/pre2] Этот подход требует дополнительных ресурсов памяти, так как создается объект класса std::set<int> совместно с заносимыми в него элементами массива. Если требуется решить задачу без использования дополнительных ресурсов памяти, то можно это сделать с помощью вложенных циклов, как показано ниже. [pre2] #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; }[/pre2] В обоих случаях вывод на консоль будет [pre2]4[/pre2] так как в массиве, используемом в качестве примера, имеется ровно 4 уникальных элемента. А как найти количество пар одинаковых элементов (что на самом деле требовалось автору вопроса)? Опять-таки, это можно сделать двумя способами: с использованием стандартного контейнера и при помощи вложенных циклов. На этот раз в качестве контейнера будет использовать стандартный контейнер std::map (или можно использовать std::unordered_map) Вот программа, в которой используется контейнер std::map. [pre2] #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; }[/pre2] А эта программа решает ту же самую задачу с помощью вложенных циклов. [pre2] #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; }[/pre2] На этот раз в обоих случаях вывод на консоль будет [pre2]3[/pre2] так как в массиве содержится ровно 3 пары одинаковых элементов. Думаю, это хороший учебный пример для начинающих программистов.

Ответов - 0



полная версия страницы