Задачу решил, через массив int : int [] arg = new int[128].
Сначала сделал массив байт: byte [] arg = new byte[128], но валидатор не принимал, хотя результат такой же. Почему нельзя решать через массив байт?
Артем
41 уровень
Массив байт
Обсуждается
Комментарии (32)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Андрей
3 мая 2021, 16:01
здравствуйте, насколько Я помню задача про максимальное повторение байта, и Мы все считанные байты укладывали в байтовый массив, индекс ячейки был ключом, а значение ячейки количество повторений, значение байта может быть от -128 до 127, итого 255, тож попался на это
0
Александр Работает в безработный
1 мая 2021, 14:07
и
0
Waumok Backend Developer
1 мая 2021, 14:09
размер массива храниться в Int
вы же не сохраняете в масив строк размер
0
Александр Работает в безработный
1 мая 2021, 14:43
это я в курсе . просто из такого вопроса
не видя самого кода я сделал вывод , что byte это слишком мало, каков вопрос , таков ответ.ж
0
Waumok Backend Developer
1 мая 2021, 14:52
не видя кода можно было сделать множество выводов ))) вплоть до того какой метод read используют, (возвращают они разное в зависимости от перегрузки), до того что просто забыли что возвращают int)
я думаю что человек на 8 уровне Core знает объем значения byte, из этого и исходил мой ответ вам)
0
Александр Работает в безработный
1 мая 2021, 15:20
исходя из этого кода
просто хочу добавить , что метод read() возвращает не само значение byte, а его представление в 32х битном виде, то есть диапазон byte в Java лежит от -128 до 127, а возвращаемое значение метода read() лежит в диапазоне от 0 до 255.
Если массив типа int то проблем нет , ну и конечно если бы использовался read(byte[]), то может быть и проблемы не возникло
0
Waumok Backend Developer
1 мая 2021, 15:37
не возникло бы... так как кодировка Ascii 127 символов так что
ArrayIndexOutOfBoundsException не грозит ему в любом массиве...размер которого [128]
и тогда уж от -1 до 255 кроме 0
0
Waumok Backend Developer
1 мая 2021, 15:43
правда на счет 0 не уверен))
да read(byte[]); - не может 0 вернуть)) тут напутал)
0
Александр Работает в безработный
1 мая 2021, 16:01
читает конкретно массив байт и тут
конкретно всё прокатит
0
Waumok Backend Developer
1 мая 2021, 16:04
?
0
Александр Работает в безработный
1 мая 2021, 16:12
Мы тут развели дисукусию не на чем , вся проблема , как мне кажется, в том , что
если было бы
то проблем не было бы , а раз он int , то это выражение не верно
0
Waumok Backend Developer
1 мая 2021, 16:23
все верно в этом выражении,
то что возвращает read() - это codePoint, автор использует его как индекс в массиве...
и инкрементит значение при повторе.
0
Александр Работает в безработный
1 мая 2021, 16:32
всё верно ,если
если, как в вопросе
то не прокатит 0
Waumok Backend Developer
1 мая 2021, 16:41
в условии задачи
в таблице ascii английские буквы лежат в диапазоне до 128
символов
0
Waumok Backend Developer
1 мая 2021, 16:43
Я не могу с вами общаться так как вы постоянно редактируете свои сообщения, я пишу ответ на одно, потом читаю другое
0
Александр Работает в безработный
1 мая 2021, 17:01
Всё верно , если бы читали с помощью read(byte[]), то всё бы прокатило , потому , что он возвращает количество реально прочитанных байт, а read() может вернуть от 0 до 255, поэтому ввлидатор и не хочет принимать .
P.S
Я тоже ошибаюсь , как и все, и поэтому пытаюсь быстро испрвить .
0
Waumok Backend Developer
1 мая 2021, 17:08
Вы не понимаете ни то о чем говорите, ни код автора
Проблем с методом read() - нет
0
Waumok Backend Developer
1 мая 2021, 17:10
Ответ Ксения уже написала 3 часа назад
если вы не поняли то объясню,
в массиве байт как только результат инкремента превышает 127 , значение становится отрицательным
0
Waumok Backend Developer
1 мая 2021, 14:06
код решения можно?
0
Артем
1 мая 2021, 14:09
try(FileInputStream reader = new FileInputStream(args[0])){
int [] arg = new int[128];
while(reader.available()>0) {
arg[reader.read()]++;
}
for(int i = 0;i<arg.length;i++){
if(arg[i]!=0){
System.out.println((char)i + " " +arg[i]);
}
}
0
Артем
1 мая 2021, 14:11
почему валидатор не принимает так: byte [] arg = new byte[128];
0
Ksenia Volkova Java Developer в DXC Master
1 мая 2021, 14:14
Потому что символ может встречаться больше 127 раз.
0
Артем
1 мая 2021, 14:19
А если он встречается 10000000 раз?
0
Waumok Backend Developer
1 мая 2021, 14:20
Мне кстати оч понравилась ваша идея
Значение после max_value +1 становится min_value
как у любого примитива целочисленного)
10кк эт инт еще) 0
Артем
1 мая 2021, 14:27
а ну да))
Ну я хотел сказать если значение будет больше чем влезает в int, то все, пиши пропало)?
0
Waumok Backend Developer
1 мая 2021, 14:28
ну так станет отрицательным значение))
0
Артем
1 мая 2021, 14:30
короче непонятно, почему он int принимает, а байт нет, хотя int тоже может кончиться) надо было еще с short попробовать
0
Waumok Backend Developer
1 мая 2021, 14:31
Ну Валидатор просто тестирует своим файлом))) там видимо в тексте один и тот же символ повторяется много раз))
0
Ksenia Volkova Java Developer в DXC Master
1 мая 2021, 15:11
Ну такой текстовый файл, чтобы один и тот же символ встречался столько раз, сколько в int не влезет - это в реальной жизни большая редкость. А чтобы в байт не влезло - так это любой файл, где больше пары страниц текста.
0
Артем
2 мая 2021, 09:02
Сейчас решил задачу Нити и байты, там в принципе тоже самое почти, прочто массив int [256] сделал. После решения посмотрел правильный ответ, а там массив byte [256])))))То есть в этой задаче вероятность того что символ встретится больше 127 раз меньше?))
0
Waumok Backend Developer
2 мая 2021, 10:04
выглядит так, что они подогнали правильное решение под файлы которыми проверяют))
0
Ksenia Volkova Java Developer в DXC Master
2 мая 2021, 10:39
Насколько я могу судить, "правильные решения" - это просто случайным образом выбранные решения из прошедших валидацию.
Видимо, в той задаче в тестах используются маленькие файлы - поэтому такое решение смогло пройти валидацию и попало в "правильные решения".
Тут многие любят жаловаться на валидатор (в подавляющем большинстве случаев совершенно напрасно) - что он придирается и не пропускает их совершенно правильный код. Но на мой взгляд проблема скорее в том, что валидатор зачастую принимает код с недочетами, которые живой проверяющий наверняка не принял бы.
И еще раз - не надо относиться к "правильным решениям" как к эталону. Они далеко не всегда оптимальные, они просто рабочие (т.е. проходящие валидацию). И писал их скорее всего такой же студент, как и ты сам.
0