Реализуй статический метод main(String[]), который заполняет массив array значениями valueStart и valueEnd.
Если длина массива четная, его первую половину нужно заполнить значениями valueStart, а вторую — valueEnd. Если длина массива нечётная, то первую большую часть заполнить значениями valueStart, вторую меньшую — valueEnd. Для заполнения массива используй метод Arrays.fill(int[], int, int, int).
При тестировании значения полей класса Solution будут разными, учти это.
package com.javarush.task.pro.task05.task0516;
Это мое решение:
import java.util.Arrays;
/*
Заполняем массив
*/
public class Solution {
public static int[] array = new int[20];
public static int valueStart = 10;
public static int valueEnd = 13;
public static void main(String[] args) {
if (array.length % 2 > 0){
Arrays.fill(array, 0, array.length / 2 + 2 , valueStart);
Arrays.fill(array, array.length / 2 + 1 , array.length, valueEnd);
}
else{
Arrays.fill(array, 0, array.length / 2, valueStart);
Arrays.fill(array, array.length / 2, array.length, valueEnd);
}
System.out.println(Arrays.toString(array));
}
}
А вот верное:
package com.javarush.task.pro.task05.task0516;
import java.util.Arrays;
/*
Заполняем массив
*/
public class Solution {
public static int[] array = new int[20];
public static int valueStart = 10;
public static int valueEnd = 13;
public static void main(String[] args) {
int firstPart = array.length % 2 == 0 ? array.length / 2 : array.length / 2 + 1;
Arrays.fill(array, 0, firstPart, valueStart);
Arrays.fill(array, firstPart, array.length, valueEnd);
System.out.println(Arrays.toString(array));
}
}
Настя
2 уровень
почему у меня прошло решение, это баг какой то?
Обсуждается
Комментарии (13)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
wersiv
13 октября 2025, 05:56
Ты много раз берешь половину длины массива, поэтому ее можно вынести в отдельную переменную (int halfLengthOfArray = array.length / 2) - таким образом, улучшается читаемость
0
Настя
13 октября 2025, 06:16
Спасибо за совет)
0
safelogj Android Developer
12 октября 2025, 17:50
формально вы залезаете значениями valueStart на вторую половину в нечётных массивах, и потом перетираете их valueEndами. в массиве из 3х элементов вы сначала весь массив заполняете valueStartами
0
Настя
13 октября 2025, 05:05
спасибо за ответ, устала вчера наверное вот и не сообразила вопрос задала
0
ГоффMaster
12 октября 2025, 13:52
"Верное" решение - это не эталон. Это одно из возможных решений какого-то другого студента, которое прошло валидатор. Ориентироваться на него не стоит, оно не всегда оптимальное, а местами бывает откровенно плохое.
Твоё решение вполне, делает что требуется. Но если подумать, то можно рассчитать сколько элементов попадёт в первую половину и без ифов, как у тебя, и без тернарного (который тоже иф), как в "верном".
Если заело, то подумай, какое несложное математическое выражение даст нам первую половину независимо от того, чётное число элементов или не чётное. Мне известны несколько вариантов.
0
Настя
13 октября 2025, 05:02
я даже не знаю как? можете рассказать чтобы я знала, что это за несколько вариантов?
спасибо за ответ
0
Настя
13 октября 2025, 05:13
Я только начинаю знакомиться с программированием и по моему ничего не знаю, у меня даже догадок нет как это сделать без тернарного оператора
0
Денис Enterprise Java Developer
13 октября 2025, 08:08
Так Гофф ведь и не совсем про программирование говорит, а про математику. Если говорить совсем математически то это простое деление с округлением вверх. Ну например 5 / 2 = 2.5 округляем следовательно до 3. Вот и будет тебе 3 + 2 первая половина больше вторая меньше.
Можно немножко схитрить если понимать немножко в типах данных. Например в Java Integer это целое число и его фишка в том, что у числа просто нет дробной части, от слова совсем.
Если ты при целочисленном делении поделишь 5 / 2 то получишь ровно 2. И вот тут самое время включить наблюдательность. Как будто бы к этой двойке достаточно добавить единичку и дело в шляпе. Например
int mid = (array.length / 2) + 1;
Но уже на первой же чётной длине массива мы получаем лажу
6 / 2 = 3, для чётных длин нам нужно заполнять массивы поровну, а мы если и добавим единицу то получим 4 + 2.
Но если подумать, можно заметить интересную особенность. Находим по формуле мы только середину, первая половина массива заполняется до неё, а дальше просто оставшееся количество элементов, независимо от их количества. И в случае с чётной длинной шесть середина 3, если чётко делить пополам. А еще именно 3 нам подходит под условие задачи как середина для длинны пять.
Давай проверим на длинах 7 и 8. 7 -> 4 + 3, а 8 -> 4 + 4
Опять похоже, ну и если продолжить этот ряд выяснится незамысловатая зависимость
mid = (array.length + 1) / 2; вот и всё. И никаких тернарных операторов, никакого ветвления, сугубо арифметика и немножко наблюдательности.
P.S. Есть ещё пара занятных способов, но они скорее в лоб если честно. Я напишу, и они оба будут эквивалентны, но один "красивее":
1. int mid = array.length / 2 + array.length % 2;
Тут всё просто, ты берёшь серидину, и добавляешь к ней остаток от деления. Для нечётных это будет та самая единичка, для чётных нолик. (5 / 2) + 5 % 2 = 2 + 1
2. int mid = (array.length >> 1) + (array.length & 1);
Ровно тоже самое, но через побитовые операции.
+1
ГоффMaster
14 октября 2025, 00:23
Держи, это мальки тебе на развод:
Менее кошерно, но тоже сгодится:
Лучше, чем предыдущее, но менее понятное:
0
ГоффMaster
14 октября 2025, 00:32
ОК, последнее объясню. Если сейчас не поймёшь, то вскоре это случится.
Внутри машины все числа представлены в двоичном виде, в виде битов. Бит - это один знак, либо 0, либо 1. Число 1 будет выглядеть как 000...001 - все нули, а последний разряд единица.
Все чётные числа в двоичном представлении оканчиваются на ноль, нечётные - на единицу.
Оператор & - это побитовый И. Биты двух чисел в двоичном представлении попарно сравниваются. Если оба 1 - получается 1. Если только один бит единица или оба нули - то ноль. Так как 1 - это все разряды нули, только последний 1, то array.length & 1 даст нам 1, если число нечётное, и ноль, если число чётное.
0
Денис Enterprise Java Developer
14 октября 2025, 08:10
Первое симпатично, а дальше плагиатишь ;)
0
ГоффMaster
14 октября 2025, 23:09
Это не я, это чатджипити у тебя подглядел ;)
0
Денис Enterprise Java Developer
15 октября 2025, 08:29
хех :) Вот тебе и наглядная демонстрация страхов что "оно всех программистов заменит" :) Оно ж реально ничего нового написать не может, просто хорошо копирует уже написанное.
0