Какое число в массиве встречается чаще всего?

Какое число в массиве встречается чаще всего ? Не совсем понима,как написать данную программу на си++


Ответы (2 шт):

Автор решения: Harry

Например - 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];
}
→ Ссылка
Автор решения: Ildar

было много времени, сделал всё-таки 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;
}
→ Ссылка