Чтобы последняя решалась в 10 простых строчек, надо взять цикл по листу, а внутри него еще один цикл, который проверяет следующие элементы. Если следующий элемент такой же - увеличиваем переменную самой длинной последовательности. Если следующий элемент другой - продолжаем внешний цикл с того места, докуда дошли во внутреннем.
Решение здесь, если кто захочет разобраться (не подглядывайте заранее!): https://pastebin.com/dFFXbVVp
С последней задачей возился часа 3, создал 2 лист, кучу условий... Валидатор не пустил, сказал, что слишком сложно)) Правильно говорят "Делай только то, что от тебя просят"
Маленькая подсказка для таких как я :
Сравнивать можно и нужно только 2 последовательности чисел, иначе можно пропускать и следующую сравнивать с той что была больше в прошлый раз.
Integer является ссылочным типом данных. Числа Integer могут сравниваться через == только в радиусе -128 до 127. Причина - кэширование этого диапазона чисел. Данный диапазон чисел уже имеется в памяти , и при создании ,например, new Integer(120), мы создадим не новый объект , а лишь ссылку на ячейку памяти кэша с числом 120.
То есть new integer(120) == new Integer(120) будет true , так как оба объекта являются лишь ссылками на уже имеющийся в кэше памяти. А new Integer(1000) == Integer(1000) будет false , так как оба числа не существует в памяти , и создаются два разных объекта, даже если содержимое будет одинаковым.
-То есть , если памяти нет объекта , создаётся новый объект.
-Если в памяти есть объект(был создан вами или уже имеется по умолчанию), то создаётся ссылка на этот объект.
Любое сравнение ссылочных типов данных делается через equals. Character, Integer, String, Long, Cat, Dog Object... все сравнения делаются через equals, если мы хотим сравнить конкретно содержимое ссылок.
По этому New Integer(1000).equals(New Integer(1000)) будет одним из наиболее верных вариантом. Можно так же вызвать у Integer само число , которое хранится в виде int и сравнивать уже их . но это больше кода.
решил задачу за минут 15-20 наверно, потом были косяки с выходом за пределы длины списка, это забрало еще минут 15-20, но финишем оказалось именно превышение 127, где я отдал целый час и пошел сюда .... Спасибо вам!
Перед уходом в армию год назад я повесил в задаче на вызов 10000 методов get значение Long.MAX_VALUE и поехал отправной пункт, недавно приехал, а он до сих пор считает
мне гораздо проще было сделать по-другому:
первое значение положил в "текущее", count в 1,countМакс в 1.
далее цикл со 2-го значения по последнее:
если "текущее" == i-му, то count++; countМакс=max(countМакс,count);
иначе "текущее" = i-му, count в 1.
пс лайфхак: т.к. я из коллекции брал не сразу, а через промежуточную переменную типа int, то избежал проблем со сравнением Integer (обошелся без equals)