Правильный порядок

  • 7
  • Недоступна
Напишем утилиту для работы с массивами. Основная часть функционала готова: метод printArray() выводит в консоли все элементы массива. Тебе осталась мелочь: реализовать метод reverseArray(). Он должен менять порядок элементов массива на обратный. Метод должен работать только с массивами целочисленных
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (361)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3170013
Уровень 7
позавчера, 14:16
Все проходит
Anonymous #3170013
Уровень 7
позавчера, 14:15
public static void reverseArray(int[] array) { for (int i = 0; i < array.length / 2; i++) { int temp = array[i]; array[i] = array[array.length - 1 - i]; array[array.length - 1 - i] = temp;
Nikita
Уровень 7
5 февраля, 21:10
public static void reverseArray(int[] array) {
    int[] arrayCopy = Arrays.copyOf(array, array.length);
    for (int i = array.length - 1, j = 0; i >= 0 && j < array.length; i--, j++) {
            array[i] = arrayCopy[j];
    }
}
Создал копию основного массива. И заменял последний элемент изначального массива на первый элемент копии, потом предпоследний элемент основного массива на второй элемент копии, и так далее.
Alexey Andreevich
Уровень 9
3 февраля, 09:00
/* Комментарий удален */
UK
Уровень 10
2 февраля, 16:08
Не забывайте что можно пользоваться дебаггером, очень помогает, позволяет поглядеть в какой ячейке находиться определенное значение.
Peregrinus Umbra
Уровень 10
27 января, 12:20
Доброго времени суток, дамы и господа знатоки. Будьте любезны, помогите мне понять, почему мой код не принимается. Я сначала сделал всё иным способом. Который ниже кто-то описал как способ " в лоб". Но он не сработал. Сделал иначе. Теперь код работает, вывод в консоль верный. Но валидатор не пропускает мой вариант решения. Я даже ума не приложу, в чём дело.
Vasily Pasynkov
Уровень 7
26 января, 17:41
public static void reverseArray(int[] array) { int[] array2 = Arrays.copyOfRange(array,0,array.length); int g = 0; for (int i = array.length - 1; i >= 0; i--) { array[i] = array2[g]; g++; } } короч костыль какой-то с копии, по другому мой мозг не смог(
TheDogSh1t
Уровень 10
26 января, 21:40
тебе не обязательно использовать copyOfRange() достаточно copyOf(array, array.length) я решил, кстати, таким же образом, но мне кажется, что простым перебором через буфер будет более выгодно в плане использования памяти, так как мы будем работать с существующим массивом, а не создавать новый и работать с двумя сразу, с маленьким массивом это будет незаметно, но если массив будет содержать в себе гигантское количество элементов, то скорее всего это будет сильно отражаться на быстродействии программы.
BSM
Уровень 9
22 января, 17:23
объясните как работает этот фрагмент я все не могу понять
for (int i = 0; i < array.length/2; i++) {
            int temp = array[i];
            array[i] = array[array.length - 1 - i];
            array[array.length - 1 - i] = temp;
Антон
Уровень 22
25 января, 16:56
В цикле мы двигаемся до середины массива. Ведь мы обрабатываем на каждом шаге сразу пару членов сразу, меня их местами. А значит остановиться нужно посередине. Далее мы берем пару членов массива зеркально от середины. Представьте ряд 10 цифр от 1 до 10. Мы двигаемся к 5 и берем попарно на каждом шаге цифры 1 и 10, 2 и 8, 3 и 7, 4 и 6. Далее нам нужно как-то поменять их местами. Но как это сделать? Ведь если мы "положим" цифру 10 на место 1, то 1 придется "выкинуть". Чтобы этого избежать нам нужен какой-то буфер - еще одна ячейка для временного хранения значения. Вот и получается, что мы берем цифры 1 и 10, кладем 1 в наш буфер (переменная temp), кладем 10 в место где было 1, достаем 1 и кладем в место где было 10. На выходе вместо 1 и 10 получаем 10 и 1. Переходим к 2 и 8, повторяем процедуру. Почему индекс "зеркального" члена массива выглядит как array[array.length - 1 - i]? Для понимания нужно вспомнить, что индексация массива начинается не с 1, а с 0. Таким образом последний член массива будет именно "длинна массива - 1". А дальше мы отнимаем значение нашего счетчика. Мы же двигаемся к середине с двух сторон, верно? Если снизу вверх продвинулись на 2 шага, то и сверху вниз нужно спуститься ровно на столько же. Сомневаюсь, что для вас еще актуально, но может кому-то поможет такое объяснение "на пальцах".
Artem
Уровень 7
1 февраля, 11:07
Спасибо Вам большое.
Вержбицкий Аркадий Работает в Роскосмос
17 января, 20:16
public static void reverseArray(int[] array) { for (int i = 0; i < array.length/2; i++) { int temp = array[i]; array[i] = array[array.length - 1 - i]; array[array.length - 1 - i] = temp; } }
Timur Khasmamedov
Уровень 14
Expert
16 января, 16:37
У кого проблемы с пониманием верного решения (можно запутаться в индексах), рекомендую ввести новую переменную для свапа, и это более наглядно:
for (int i = 0, k = array.length - 1; i < array.length / 2; i++, k--) {//code}
Еще можно "в лоб" решить: создать копию массива, пройтись по ней и присвавивать переменной старого массива "новые" значения из копии. Тогда можно и без /2 А еще лучше всего на листочке расписать, да. Тогда вообще все понятно.
Владислав QA Automation Engineer в NetCracker
30 января, 20:29
Ваш вариант не сработает. Попробуйте проверить на массиве с тремя ячейками, например.
Timur Khasmamedov
Уровень 14
Expert
30 января, 21:50
Который из ? Проверил который в коде выше на примере массива из 11, 1, 3, - стало 3, 1, 11, - было
for (int i = 0; i < array.length / 2; i++) {
    int temp = array[i];
    array[i] = array[array.length - i - 1];
    array[array.length - i - 1] = temp;
}
дает тот же результат... все работает. сами-то проверяли ?
Владислав QA Automation Engineer в NetCracker
31 января, 19:19
Вот этот:
for (int i = 0, k = array.length - 1; i < array.length / 2; i++, k--)
Timur Khasmamedov
Уровень 14
Expert
31 января, 20:04
Сами-то проверяли ? Я вот проверял. Как на родном массиве, так и на тройке выше.