public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
int[] byteCountArray = new int[256];
try (FileInputStream fileInputStream = new FileInputStream(fileName)) {
while (fileInputStream.available() > 0) {
byteCountArray[fileInputStream.read()] += 1;
}
}
int maxCount = 0;
for (int byteCount : byteCountArray) {
if (byteCount > maxCount) maxCount = byteCount;
}
ArrayList<Integer> resultList = new ArrayList<>();
for (int i = 0; i < byteCountArray.length; i++) {
if (byteCountArray[i] == maxCount) resultList.add(i);
}
for (Integer resultItem : resultList) System.out.print(resultItem + " ");
}
}ivan
40 уровень
почему 256?
Решен
Комментарии (14)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Денис Enterprise Java Developer
12 апреля 2023, 14:19решение
Потому что байт в беззнаковом виде принимает значения от 0 до 255 включительно (т.е. 256 элементов). Индексация то идёт с нуля.
Твой FileInputStream.read() возвращает байт в беззнаковом виде (0-255) или -1 если всё прочёл.
Кстати именно по этому я бы тебе рекомендовал поменять в восьмой строчке условие с > 0 на != -1
Так же тебе не нужен второй цикл, ты вполне можешь посчитать maxCount на этапе чтения файла, просто сравнивай текущее значение byteCountArray[] с максимальным, но для этого есть смысл хранить fileInputStream.read() в переменной.
Третий цикл тебе не нужен тоже. Вместо этого просто пройдись по массиву byteCountArray и верни первый индекс в котором лежит максимальное значение, это тебе и вернёт минимальный байт встречающийся чаще остальных.
+2
ivan дворник
12 апреля 2023, 14:12
это правильное решение. не пойму почему 256
0
Денис Enterprise Java Developer
12 апреля 2023, 14:25
Ну ты условие не приложил, видимо я перепутал с той задачей где в случае если самых частых байт больше одного нужно вернуть минимальный. Если нужны все - решение ок, но подсчёт максимального значения я бы всё равно поменял.
Почему 256 я тебе ответил, читай внимательнее.
0
ivan дворник
12 апреля 2023, 14:28
Ввести с консоли имя файла.
Найти байт или байты с максимальным количеством повторов.
Вывести их на экран через пробел.
Закрыть поток ввода-вывода.
Требования:
• Программа должна считывать имя файла с консоли.
• Для чтения из файла используй поток FileInputStream.
• В консоль через пробел должны выводиться все байты из файла с максимальным количеством повторов.
• Данные в консоль должны выводится в одну строку.
• Поток чтения из файла должен быть закрыт.
вот условия
0
Денис Enterprise Java Developer
12 апреля 2023, 14:37полезный
Если интересно, я бы это переписал так:
+1
ivan дворник
12 апреля 2023, 17:55
спасибо вам огромнейшее. вот это решение прояснило мне картину и сэкономило кучу времени...
все дело в этой строчке
0
Денис Enterprise Java Developer
12 апреля 2023, 18:14
На самом деле тоже самое делалось и в твоём решении на 9 строке. Присмотрись к квадратным скобкам. Я вынес в отдельную переменную только потому, что там же во время чтения хотел определить максимум и выкинуть лишние шаги из твоего решения.
0
ivan дворник
12 апреля 2023, 18:29
да я это уже понял. просто вот эта самая строка это что было в прошлых задачах. и именно эта связь мне помогла. да и ваша логика проще чем в правильном решении и она похожа на логику правильного решения в предыдущих задачах. поэтому вы настолько мне помогли. как минимум 1-2 часа времени сэкономили
+1
ivan дворник
12 апреля 2023, 19:16
что делает строка 17 и 18?
0
ivan дворник
12 апреля 2023, 19:21
?
0
Денис Enterprise Java Developer
12 апреля 2023, 19:38
Хрень, проходятся по массиву байт и добавляют в промежуточный список все которые имеют наибольшее количество вхождений. Потом уже по промежуточному списку проходятся и выводят на экран, вопрос - зачем? Это же просто лишний шаг.
0
ivan дворник
12 апреля 2023, 20:08
вы видимо перепутали. 17 и 18 строка не у меня в решении а у вас
0
Денис Enterprise Java Developer
12 апреля 2023, 20:29
А :) действительно тупанул... вечер же.
Ну 17 не далеко ушла, она проверяет значение в массиве байт если оно равно максимальному такой байт нам нужен, а как мы условились - байты в этом массиве представлены его же индексами, именно по этому на 18й строке на вывод в консоль отправляется i - текущий индекс проверяемого массива.
А вот System.out.printf("%d ", i); это такой специальный метод для вывода в консоль с использованием паттерна. Первым параметром передается сам паттерн, а дальше идут переменные из него.
%d означает, что там будет стоять число, после него идёт пробел.
Кроме %d есть и другие токены, эта штука умеет дополнять строку символами, умеет отбрасывать знаки после запятой если они не нужны, в общем много чего умеет.
Аналогичным образом работает метод String.format() крайне рекомендую погуглить и научиться этим пользоваться - очень удобная штука.
0
ivan дворник
13 апреля 2023, 20:26
спасибо
0