• Предмет: Информатика
  • Автор: ursostupidfreak11
  • Вопрос задан 1 год назад

Дан массив из 20 случайных чисел от 1 до 10. Вывести в консоль самое часто встречающееся число или список чисел.
Пример: [1, 2, 6, 5, 3, 2, 7]
Самое частое число - 2

Ответы

Ответ дал: 4688f71163
1

Ответ:

Рассмотрим решение на языке Python

Объяснение:

Первый способ

Отсортируем имеющийся список как показано.

Получим кортеж, где есть два значения: key и value.

Первое число - собственно, элемент. Второе число - количество раз.

Второй способ

Создадим словарь и будем считать количество элементов.

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

Третий способ

Создадим словарь, множество, список ключей.

Как и во втором способе, пройдемся по элементам и будем увеличивать счетчик на 1.

Выведем с помощью метода format, чтобы было красиво.

Четвертый способ

Самый простой, и тем не менее, правильно работающий. Используем библиотеку collections, откуда возьмем тип данных Counter - словарный тип, используемый для подсчета объектов.

Приложения:

MaxLevs: В Python помимо всего перечисленного есть ещё контейнер Counter. Скармливаешь ему список и получаешь словарь ЗначениеИзСписка -> Частотность. При такой реализации достаточно посмотреть частотность первого элемента Счетчика и получить все элементы с такой же частотностью.
4688f71163: Правда, совершенно забыл про collections, спасибо :)
4688f71163: Дополнил ответ четвертым способом
MaxLevs: Запомнил его на всю жизнь после одного собеседования :D
Ответ дал: MaxLevs
1

Приведу пример на Haskell.

  • import Data.List (group, groupBy, sort, sortBy, unfoldr)
  • import Data.Function (on)
  • import System.Random
  • getFreq :: [Int] -> [Int]
  • getFreq xs = last $ [[fst zs | zs <- ys] | ys <- groupBy ((==) `on` snd) . sortBy (compare `on` snd) $ [(head x, length x) | x <- group . sort $ xs]]
  • randomList :: Int -> (Int, Int) -> IO [Int]
  • randomList 0 _ = return []
  • randomList n range = do
  •  r  <- randomRIO range
  •  rs <- randomList (n-1) range
  •  return (r:rs)
  •  
  • main :: (Int, Int) -> IO()
  • main range = do
  •  rs <- randomList 20 range
  •  print rs
  •  print $ getFreq rs

Здесь алгоритм поиска наиболее часто встречающихся чисел последовательности реализован в функции getFreq. В ней мы исходный массив сортируем и группируем соседние элементы по значению. Затем формируем список из кортежей (число, частотность) и сортируем по возрастанию частотности. Затем группируем соседей по частотности, выделяем только значения, без указания частотности и берем последний элемент – самая большая частотность. Этот элемент – список из самых часто встречающихся элементов.

Приложения:

ursostupidfreak11: Спасибо! А есть на языке JavaScript?
MaxLevs: В JS есть библиотека Lo-Dash. В ней реализована функция countBy(). Прогоняешь через неё, получаешь частотность всех элементов. Первый, вроде, самый частотный. Если несколько, пробегись по началу и собери элементы со схожей частотностью.
Вас заинтересует