Какое число в массиве встречается чаще всего?
Какое число в массиве встречается чаще всего ? Не совсем понима,как написать данную программу на си++
Ответы (2 шт):
Например - https://ideone.com/KOsRlB
int main()
{
int arr[] = { 1, 3, 876, 22, 456, 1, 456, 18, 34546, 1};
map<int,int> m; // или unordered_map<int,int> m;
for(auto i: arr) m[i]++;
auto it = max_element(m.begin(),m.end(),[](auto a, auto b) { return a.second < b.second; });
cout << it->first;
}
Можно попробовать и другие способы.
Update
Вот еще - неэффективно. Но просто :)
int main()
{
int arr[] = { 1, 3, 876, 22, 456, 1, 456, 18, 34546, 1};
const int arr_size = sizeof(arr)/sizeof(*arr);
// Такой же по размеру второй массив c нулями
int aux[arr_size] = {0};
// Для каждого элемента ...
for(int i = 0; i < arr_size; ++i)
{
// ...находим первый такой элемент
bool found = false;
for(int j = 0; j < i; ++j)
if (arr[j] == arr[i])
{
found = true;
aux[j]++; // и увеличиваем его счетчик в aux
break;
}
if (!found) aux[i]++; // (или тут, если такого элемента еще не было)
}
// Находим максимум в aux
int max = 0, idx = -1;
for(int i = 0; i < arr_size; ++i)
if (max < aux[i]) max = aux[idx = i];
// и выводим соответствующий элемент исходного массива
cout << arr[idx];
}
было много времени, сделал всё-таки stl подобный обобщенный алгоритм который принимает сортированный вектор и возвращает итератор на моду, сложность O(NlogN), память O(1), алгоритм покрыл тестами, все прошел. если мод несколько то возвращает итератор на последнюю, думаю над апдейтом возвращать вектор мод.
очень буду рад критике моего кода и возможным улучшениям и предложениям, и хотелось бы знать можно ли было не писать такой алгоритм и используя стандартные средства решить задачу в одну строку?
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cassert>
template<class T>
typename std::vector<T>::iterator find_mode(
typename std::vector<T>::iterator first,
typename std::vector<T>::iterator last)
{
if (first == last) {
return last;
}
auto modeIterator = first;
size_t modeCounter = 0;
auto pastIterator = first;
size_t currentCounter = 0;
for (;first != last;++first) {
if (*first == *pastIterator) {
++currentCounter;
}
else {
if (currentCounter > modeCounter) {
modeCounter = currentCounter;
modeIterator = pastIterator;
}
currentCounter = 1;
}
pastIterator = first;
}
if (currentCounter > modeCounter) {
modeCounter = currentCounter;
modeIterator = pastIterator;
}
return modeIterator;
}
void test_find_mode()
{
using vector = std::vector<int>;
using iterator = std::vector<int>::iterator;
{
vector verifiable;
iterator expected = verifiable.end();
assert(find_mode<int>(verifiable.begin(), verifiable.end()) == expected);
}
{
vector verifiable = { 1,1,1 };
std::sort(verifiable.begin(), verifiable.end());
iterator expected = verifiable.end();
assert(*find_mode<int>(verifiable.begin(), verifiable.end()) == 1);
}
{
vector verifiable = { 5,6,7,5 };
std::sort(verifiable.begin(), verifiable.end());
iterator expected = verifiable.end();
assert(*find_mode<int>(verifiable.begin(), verifiable.end()) == 5);
}
{
vector verifiable = { 5,6,7,7,5,5 };
std::sort(verifiable.begin(), verifiable.end());
iterator expected = verifiable.end();
assert(*find_mode<int>(verifiable.begin(), verifiable.end()) == 7);
}
std::cout << "test_find_mode is OK\n";
}
int main()
{
test_find_mode();
return 0;
}