Самые частые байты

  • 20
Ввести с консоли имя файла. Найти байт или байты с максимальным количеством повторов. Вывести их на экран через пробел. Закрыть поток ввода-вывода.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (457)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Евгений
Уровень 22, Омск, Россия
3 июня, 11:47
Решил как я думаю через "пень-колоду" итого 5 часов минус и куча быканов в пепельнице на балконе)) мой алгоритм - 1. считал биты в Arraylist 2. закрыл поток чтения 3. ввел 2 переменные int счетчики и обнулил сразу 4. цикл в цикле, перебирал лист и считал повторы (счетчик1) 5. при выходе из внутреннего цикла сравнивал счетчики (счетчик2 принимает большее значение из двух), обнуляю счетчик1 6. Завожу Map типа HashMap 7. снова цикл в цикле, перебираю Arraylist при совпадении значений тех же счетчиков, пишу в Map данные, ключом является текущее значение Arraylist во внешнем цикле ( " .put (list.get(i), 0) " ). Счетчик 1 обнуляю после внутреннего цикла. 8. ну а последнее - вывод в консоль ключей Map через пробел я думаю есть проще решение, но я до него еще "не дорос", удачи, надеюсь коммент не удалят, может поможет кому ))
Алексей
Уровень 29, Санкт-Петербург, Россия
14 мая, 20:49
чтобы изменить счетчик в Map есть метод с лямбдой: byteMap.compute(Object key,(k,v)->v+1); // k-ключ, v - значение. чтобы пройтись по Map: for(Map.Entry entry : byteMap.entrySet()) {} Пары в Map, это объекты Map.Entry<K,V>
Nick
Уровень 20
29 апреля, 05:20
Судя по комментариям, понял, что лоханулся, забыв про Collections.frequency. Хотя с другой стороны без всякого дополнительного List сразу в записывал в Map при считывании файла, так что думаю не сильно проиграл
int i = inputStream.read();
if (map.containsKey(i))
   map.put(i, map.get(i) + 1);
else
   map.put(i, 1);
Anonymous #2568901
Уровень 23
8 мая, 10:43
А если несколько байт были с одинаковым количеством повторений?
Nick
Уровень 20
9 мая, 07:13
ну как бы по заданию, вроде он их все и выводит, т.е. всё норм.
Ivan
Уровень 18, Москва, Россия
27 апреля, 08:23
Может быть кому поможет: 1. Через Collections.frequency c помощью цикла выяснил сколько максимально раз встречается какой либо элемент (максимальное количество повторов одного элемента) 2. Вторым циклом сравнил через Collections.frequency частоту с которой встречается каждый элемент с максимальным значением (из пункта один) и добавлял эти элементы в HashMap
NBychenkov
Уровень 31, Москва, Россия
24 апреля, 14:34
Разных байтов (8-и битных) может быть 256. Массив из 256 байтов == 256 счетчиков. Прочитанный байт является индексом массива. "Задача имеет решение и дальнейшего интереса не представляет"(с)анекдот
Михаил
Уровень 18, Санкт-Петербург
19 апреля, 10:17
Решал долго в основном из-за того, что условие в голове держал, вместо того, чтобы нарисовать на бумажке. Естественный способ - через коллекции ArrayList и HashMap. Особенно помучился над сортировкой HashMap по значению. Нашел где-то метод этой сортировки, допилил и все получилось аж со второго раза - недоглядел println вместо print. Не знаю, может по-деревенски, но зато сам:)))
Артём
Уровень 23
9 апреля, 19:15
Я сделал с помощью Set (чтобы получить массив уникальных значений) и трёх ArrayList-ов. Каюсь, это было не лучшее решение, уложился в 61 строку со всеми кавычками, но оно того стоило.(вспомнил как работает Set, даже про сортировку TreeSet почитал ) Наверное не особо хотелось лезть в Map, хотя скажу, что мне с ним понравилось работать. Как увидел решение валидатора, вообще не врубился , что там происходит, начал переписывать этот код, чтобы понять суть, уж очень он компактный ( всего 34 строки). И тут меня осенило и притом пару раз, особенно способ решения) Первое о чём напомнила эта задача, что один байт, как вы знаете может принимать всего 256 значений ( от 0 до 255), это значит, что любой байт, который мы получим из FileInputStream, при чтении из файла попадет в диапазон значений такого массива int[] byteCountArray = int[256] (по индексу элемента). Например из файла придет значение 32 (это символ пробела в байтовом виде) 5 раз подряд ( 32, 32, 32, 32, 32 ) то этот код : byteCountArray[fileInputStream.read()] += 1 - будет каждый раз в массиве byteCountArray в ячейку с индексом [32] добавлять единицу (+1), первый раз там был ноль(по умолчанию), после прихода этих пробелов, в ячейке будет число 5. Этот массив сразу считает какие символы(точнее их байты) и сколько раз пришли. Ничего лишнего. А дальше находим максимальное значение из byteCountArray ( это количество повторов символов), а потом думаем как их вам удобнее вывести на экран. В общем полезная разборка кода получилась, на мой взгляд отличная задачка! Спасибо разработчикам!
Дмитрий
Уровень 35, Витебск, Беларусь
8 апреля, 11:55
Решил через
HashMap<Integer, ArrayList<Integer>> frequencies = new HashMap<>();
Татьяна
Уровень 28, Москва
29 марта, 17:08
по условию задачи нужно вывести те числа, которые чаще всего повторяются в списке, но валидатор принял, когда выбраны все максимальные числа в списке и выведена их позиция. Условия путают
Igor
Уровень 31, Минск, Беларусь
6 апреля, 07:53
В консоль через пробел должны выводиться все байты из файла с максимальным количеством повторов.
В консоль нужно вывести байт с максимальным количеством повторений в файле. А если таких байтов несколько, то вывести все байты в консоль. Просто нужно внимательно читать условие к задаче. Задача легчайшая, такую мы решали на уровне Syntax.
Салават Шакиров Backend Developer в Лига Цифровой Эконом
25 марта, 23:00
1. создаем List<Integer> и отдельно Map<Integer, Integer> 2. считываем байты, добавляем в list 3. закрываем поток 4. добавляем в map все элементы list - в качестве ключа, а в качестве значения количество повторений (алгоритмов в инете полно) 5. находим максимальный элемент в коллекции - Collections.max(map.values()) и вытаскиваем из мапы значения выводим в консоль через пробел. p.s если максимальных элементов несколько нужно вывести все, например: 10 13
Дмитрий
Уровень 26, Москва
28 марта, 17:47
алгоритм в мапу просто необходим
for(Integer i: list) map.put(i,Collections.frequency(list,i));
NAO-IT
Уровень 22, Красногорск, Россия
25 апреля, 19:06
За нахождение подобных решений и люблю комменты