чет\нечет решается в 3 строчки без массивов, регистрации и смс:
1. while число n не равно 0
2. int i = (n % 10) % 2 == 0 ? even++ : odd++;
3. число n равно число n / 10
Зачем нужны первые четыре задачи с finalize? Зачем учиться и вообще знать про устаревший несиспользуемый метод?
Эти задачи и лекции про finalize убрать и курс стане лучше.
В задаче про создание 50000 котов и собак finalize() переопределён и вызывается через super - ссылаясь на текущий экземпляр родительского класса, тобишь Object. Отсюда у меня возник вопрос, если я конечно всё правильно понял: " Зачем они это сделали и является ли это более правильным чем написание обычного метода без переопределения?"
на всякий случай пишу для тех кому не понятно
Зачем они это сделали -> чтобы иметь возможность сделать какое "свое" действие, здесь это вывод в консоль.
В задаче про чёт/нечёт строку сразу сохранял в массив символов (ребята в интернете подсказали как это сделать), прямо в момент ввода, а потом в цикле проходил массив, по очереди каждый символ переводил в int и проверял чёт/нечёт. Решение на 30 строк.
Посмотрел "правильное" решение: сломается как только введёшь число больше 1 млрд. Бу-у-у-у.
Владимир, программа сломалась, не потому что программа в правильном решении плохая, а потому что используется int, у него есть ограничение в использовании вместимых в него чисел, а это: минимальное значение - 2,147,483,648, максимальное значение 2,147,483,647 (включительно). Нужно просто еще не забывать про вместимость типов данных. Так что это не программа плохая :)).
Ну и нужно учитывать, что такую элементарную вещь как в задании, нельзя решать 30 строками кода иначе вы представляете сколько будет выполняться программа, если она не состоит из одного условия, а к примеру из очень большого кол-ва задач, тогда это будет только тормозить программу. По этому, нужно писать код всегда максимально, по возможности коротко и понятно, чтобы ваши коллеги или разработчик который придет на ваше место не упал со стула при виде такого громоздкого решения маленькой задачи))).
Собственно чем легче читаемость и меньше место занимаемое в памяти, тем лучше, как-то так.
А! И вот ещё момент...
Если в "правильном" решение на вход подать 10 чётных чисел, например вот так:
"0000000000"
то результат будет:
Even: 0 Odd: 0
Это что? Правильно?
Нет. Ноль - это чётное число.
И если пользователь введёт строку начинающуюся с "0", или вообще вот такую строку "0000000000", то Ваш способ приведёт всё к int не посчитает эти нули и ответ будет неверный.
И опять же, никуда не денется вариант, если написать много цифр, то они не влезут в int и ответ будет неверный.
Написал об этом в сапорт. Возможно на текущем этапе обучения нет смысла усложнять, но может есть смысл обозначить этот момент у условиях задачи.
Написал выше свой вариант, но что-то тупанул и выложил полное решение. Его скрыли, т.к. нельзя по правилам выкладывать полное решение.
Но там строчек столько же сколько и в правильном решении, просто все символы сразу кладём в символьный массив, а потом циклом проходим и считает кто там чётный, а кто нечётный.
Так в этом и разница, между строками и числами.
В решении используется деление в 2х местах, и ноль считывается как ноль, и мы работаем с этими данными. Т.е. программа так и понимает пользователь ввел ноль значит деление выдаст ноль. Т.к. деление идет на ноль, мы считываем цифры а не строки.
Просто с чем будет программа работать, если даже в цикле указано что вводимое число, больше нуля. А если мы вводим ноль, то и программа выдаст ноль, ей не с чем работать.
Задача про 50000 несколько раз запускал и даже валидацию прошло, но ни разу не написало про уничтожение.
И ещё непонятно почему finalize зачёркнуто... 🤔
Кто-нибудь знает почему?
Спасибо.
А в следующей задаче, после валидации, ради проверки поставил не 50 000, а 5 000 000 и выяснилось что периодически он всё-таки запускается. Счётчик периодически уменьшается и под конец было не 5 000 000 котов, а 1 310 547.
Оно и не сразу будет уничтожено, а как только запустится сборщик мусора.
Они перечеркнуты не в Java, а в Вашей IDE. Что значит что он не рекомендуется для использования и считается устаревшим.
Не знал, что IDEA таким образом обозначает устаревшие штуки.
Зачем же в таком случае изучать finalize... Может есть более передовой способ.
Погуглю. Спасибо.
Поставь ради теста, не 50 000, а 5 000 000. Я так понял, Java там сама по себе, в зависимости от какой-то своей необходимости иногда запускает удаление.
Последняя задачка заставила погуглить 😁, дурацкое чувство, когда ты знаешь как решить, но не знаешь КАК 🤣 Оказалось всё не так сложно: переводим строку в массив и разделяем на символы. Создаём массив интов, поочереди, в цикле, проходим по стринговому массиву и переопределяем строки в инты. А потом обычный if с вычислением остатка и всё.) Решение на 40 строк.
Решал похоже. 9 строк от ввода до вывода включительно (можно 7, если фигурные скобки не делать красиво :-) ).
P.S. Массив интов можно и не создавать, сразу в цикле преобразовывать и считать.
finalizeзачёркнуто... 🤔 Кто-нибудь знает почему? Спасибо.