Хотел перевернуть массив, сам не смог написать написать алгоритм, путем гугла нашел это:
for (int i = 0; i < array.length / 2; i++) {
int tmp = array[i];
array[i] = array[array.length - i - 1];
array[array.length - i - 1] = tmp;
}
Может кто объяснить, как это работает с массивом, который array.length() = 5, например?
CilitBang
25 уровень
Перевернуть массив
Решен
Комментарии (12)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Oleksii
11 июня 2021, 11:14
Для себя подведу итог )
Напишу для себя своими словами.
Находим делением на 2 "срединую точку массива+1". При использовании символа "<" к этой "срединной отметке + 1" мы получим первую половину массива.
Так как в Джава деление без остатка, то, например, при 9: это 4 (остаток отбрасывается).
Так как отсчет с 0, то 0,1,2,3 - это 4 элемента. 5й (срединный элемент) нас не интересует, так как он останется на своем месте при развороте массива.
Если массив из четного количества элементов, например, 8, то получим те же 4 и такую же ситуацию, кроме того, что у нас не будет срединного элемента, который остаётся на своем месте. Все элементы поменяют свое местоположение.
Теперь для следующего шага нам пригодится временное хранилище для одного из элементов.
Начнем с элемента из первой половины массива, а именно: нулевого. Отправляем его во временное хранилище, а в 0 положение массива помещаем крайний/последний элемент.
Из временного же хранилища в крайний / последний элемент массива помещаем то, что было в 0 положении, а сейчас "томится в заточении" в промежуточной переменной.
Теперь двигаясь по циклу и используя промежуточное хранилище, меняем элементы массива местами в такой очередности: второй с начала отсчтета элемент меняем со вторым с конца, третий с начала меняем с третьим с конца и так далее.
+3
Александр
2 декабря 2020, 15:37
Массив перевернуть можно:
1) Можно создать отдельно метод. Пример: sort(array) - сам назвал так
2) В нем прописать: а) Сортировка массива от меньшего к большему через класс Arrays с методом sort
б) Делаем цикл for (int i=array.length -1; i>0; i--) - от последнего числа (внешний)
в) Делаем еще цикл for(int j=0; j<i; j++) - от первого числа (внутренний)
г) Во внутреннем цикле: выбрасываем из нулевой-(j) ячейки число - если меньше
д) В первую ячейку кидаем число из второй - (j+1)
е) Во вторую ячейку -(j+1) кладем выбросившее число то есть (j)
3) В main вызываем наш метод с параметром массива - sort(array);
4) Вывод на печать через for each - это выглядит так - for (int x : array) { System.out.println(x); }
+1
Stan
29 сентября 2020, 13:25
Самый простой вариант создать новый массив и наполнить числами старого с конца
int[] marks2 = new int[marks.length];
for (int i = marks.length-1; i > 0;) {
for (int j = 0; j < marks.length; j++) {
marks2[j] = marks[i];
i--;
}
}
+6
Виктор Яценко
6 мая 2020, 14:15
если вдруг кто наткнется на этот пост, я прочитал и ничего не понял. проще здесь
http://proglang.su/java-examples/strings-reverse
+1
Kango VinceExpert
25 декабря 2021, 13:57
Так это только выводит массив в обратном порядке. Сами числа остаются на своих местах.
+1
MR
23 сентября 2019, 17:52
А мне вот хотелось бы подробных разъяснений, так как я вообще ни во что не въезжаю. Как меняются элементы в такой структуре, что значит array[array.length - i - 1]? Чтобы было понятней, можно использовать вместо i цифры, пожалуйста? серьезно понять не могу как это берет элемент с конца и переставляет в начало, начало ещё вижу откуда берется
+1
MR
23 сентября 2019, 18:04
-1 делается потому, что изначально счётчик поставлен на 0?
типо, есть 5 элементов в массиве: аrray {1, 2, 3, 4, 5} (но считается length по индексам, типо 0,1,2,3,4?)
первая переменная при первой итерации цикла (i = 0) берет себе array[0](то есть аrray[1] - точно или нет??), а вторая array[array.length - i - 1] берет себе array[5 - 0 - 1] (потому что был ноль в счетчике?) и по итогу это тоже самое, что и array[4] (наш конечный элемент)
и так далее пока не доберемся до средины, которая всегда неизменна?
маякните мне пожалуйста, что не так, а что так
0
CilitBang QA в КЕФИР!
24 сентября 2019, 07:41
Проще всего тебе взять массив, например {4, 1, 3, 2}, взять листочек и ручку, и прогнать массив через этот цикл. Это будет лучше всех объяснений.
По факту:
1. -1 потому что для нашего массива {4, 1, 3, 2} length равен 4, в то время как последний индекс 3, а работаем мы именно с элементами.
2. При первой итерации мы кладем в tmp элемент array[0], т.е. в tmp лежит 4. Потом мы меняем местами элементы, говорим, что array[0] теперь array[array.length - i - 1], т.е. array[0] = array[4 -0 - 1], итого array[0] = 2, последнему элементу, а array[array.length - i - 1] = tmp, куда, как мы помним, положили array[0]. После этого прохода массив выглядит так {2, 1, 3, 4}.
3. Потом еще один проход и меняются по такой же схеме средние элементы, с индексом 1 и 2, и получается {2, 3, 1, 4}.
+4
MR
24 сентября 2019, 15:56
Благодарствую.
Вообще я в принцип уже разобралась, пока формулировала. Сам прогон бы по листку мало бы чем помог, так как я вообще азы не догоняла, как выяснилось. Теперь же это улажено.
0
Павел МинеевExpert
17 сентября 2019, 07:53решение
Сначала первый и последний элементы меняются местами, затем второй и предпоследний и т.д.
Если размер массива - нечетное число, то средний элемент менять не надо, поэтому индекс до не него и не дойдёт.
+7
CilitBang QA в КЕФИР!
17 сентября 2019, 07:59
Всерн не до конца понимаю. Почему i < array.length / 2? Получается ведь что он вообще не дойдет до конца массива. Как я вижу: например, если array.length() = 4, то цикл будет работать, пока i < 2. Т.е. он поменяет пару элементов туда сюда и все.
0
CilitBang QA в КЕФИР!
17 сентября 2019, 08:02
Все, разобрался. Спасибо. Проблема еще дополнительно в том, что я неправильно прочитал цикл.
+1