Как сделать реверс массива java

Обновлено: 05.07.2024

Существует массив и его надо развернуть (или инвертировать) и получить массив .

Находим середину массива — array.length / 2 . Перебираем элементы массива от начала до середины и одновременно меняем местами элементы с индексом i и array.length — i — 1 . Для обмена значениями используем вариант с введением временной переменной, рассмотренный в предыдущем разделе:

Обратите внимание, что в классе ArrayInverter нет метода main() — будем вызывать метод invert() из другого класса. Для вызова метода, находящегося в другом классе, пишем имя класса — ArrayInverter.invert(array1) :

Если мы внимательно посмотрим на код в классе ArrayInverterTest1 , то увидим, что один блок кода повторяется пять раз. Дублирование кода — это плохая практика, поэтому вынесем повторяющийся код в отдельный метод, который будет вызываться пять раз с разными значениями:

Как поменять элементы массива в обратном порядке в Java

Напишите программу, которая меняет местами элементы одномерного массива из String в обратном порядке. Не используйте дополнительный массив для хранения результатов.

Решение:
Комментарии к задаче:

В результате выполнения этого кода получим перевернутый массив: вместо "Каждый охотник желает знать где сидит фазан" — "фазан сидит где знать желает охотник Каждый "


Как была решена задача? Основная ее часть — это фрагмент:

Он по очереди меняет местами противоположные элементы массива, используя как посредника дополнительную переменную String temp (temp — от temporary, "временный"). Можно было бы обойтись и без нее, если бы массив хранил переменные числового типа.

Тут есть a[i] и малопонятное a[n-i-1]. Но на самом деле n-i-1 это просто формула для определения "противоположного" элемента массива:

task2_arr_prince

Если бы мы имели массив, который бы состоял из элементов a, b, c, d, e и f, то есть массив из 6 элементов (n=6), "противоположным" (то есть элементом a[n-i-1]) для каждого из них были бы f для a, e для b и d для c. Цикл из фрагмента кода выполнялся бы три раза, до элемента d (i=0, 1, 2). Граница выполнения массива показана оранжевой линией на рисунке.

Так, обратите внимание, что мы не должны проходить циклом весь массив, чтобы поменять его элементы местами.

Надеемся — наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java. Детальную информацию смотрите у нас на сайте.

Как реверсировать массив int в Java?

Чтобы перевернуть массив int, вы меняете местами элементы до тех пор, пока не достигнете середины, например:

Таким образом, вы меняете местами каждый элемент дважды, так что результат будет таким же, как и в исходном списке.

С Общим.Lang , Вы можете просто использовать

В большинстве случаев гораздо быстрее и безопаснее придерживаться легко доступных библиотек, уже прошедших модульное тестирование и тестирование пользователями, когда они решают вашу проблему.

Я думаю, что немного легче следовать логике алгоритма, если вы объявляете явные переменные, чтобы отслеживать индексы, которые вы меняете на каждой итерации цикла.

Я также думаю, что это более читаемо, чтобы сделать это в цикле while.

java.util.Collections.reverse() может реверсировать java.util.List s и java.util.Arrays.asList() возвращает список, который обертывает конкретный массив, который вы передаете ему, поэтому yourArray реверсируется после вызова Collections.reverse() .

Стоимость-это всего лишь создание одного объекта-списка, и никаких дополнительных библиотек не требуется.

Аналогичное решение было представлено в ответе Тарика и их комментаторов, но я думаю, что этот ответ был бы более кратким и более легко разбираемым.

Вот как я лично решил бы эту проблему. Причина создания параметризованного метода заключается в том, чтобы разрешить сортировку любого массива. не только ваши целые числа.

Надеюсь, ты что-нибудь почерпнешь из него.

Наиболее эффективно просто перебирать массив в обратном порядке.

Я не уверен, что решение Аарона делает это vi этот вызов Collections.reverse(list); кто-нибудь знает?

Ваша программа будет работать только для length = 0, 1 . Вы можете попробовать :

Если вы работаете с более примитивными данными (например, char, byte, int и т. д.), то вы можете выполнять некоторые забавные операции XOR.

В случае Java 8 мы также можем использовать потоки для реверса массива целых чисел как:

Вот простое и быстрое решение. Надеюсь, это поможет!.

Не было бы гораздо более маловероятным ошибиться, делая это таким образом?

Ниже приведена полная программа для запуска на вашем компьютере.

Для программ на матрице, использующих массивы , это будет хорошим источником.Пройдите по ссылке.

Здесь простая реализация, чтобы обратить массив любого типа, плюс полная/частичная поддержка.

Вот соответствующий модульный тест

Решение с o(n) временной сложностью и O(1) пространственной сложностью.

Есть два способа решить эту проблему:

1. Переверните массив в пространстве.

Шаг 1. Поменяйте местами элементы в начале и конце индекса.

Шаг 2. Увеличьте начальный индекс уменьшите конечный индекс.

Шаг 3. Повторите шаг 1 и Шаг 2 до начального индекса Для этого временная сложность будет равна O (n), а пространственная — O (1)

Пример кода для обращения массива в пространстве: например:

2. Реверсируйте массив, используя вспомогательный массив.

Шаг 1. Создайте новый массив размером, равным заданному массиву.

Шаг 2. Вставить элементы в новый массив, начиная с начального индекса, из данный массив начинается с конечного индекса.

Для этого временная сложность будет O (n), а пространственная сложность-O (n)

Пример кода для реверсирования массива с помощью вспомогательного массива выглядит следующим образом:

Кроме того, мы можем использовать Для этого нужно собрать API из Java.

API коллекций внутренне использует тот же обратный подход в пространстве.

Пример кода для использования API коллекций выглядит следующим образом:

Данный метод изменяет исходный массив.
После его применения порядок элементов в массиве меняется на обратный.

Он возвращает ссылку на измененный массив.

Обратите внимание, никакого нового массива не создается. Изменяется сам массив arr и возвращается ссылка на измененный массив.

См. также

Не повторяйте моей ошибки - я считал, что этот метод сортирует массив по убыванию. На самом деле, он просто меняет порядок следования элементов на противоположный.

А я вообще всегда думал, что reverse() генерирует новый массив и возвращает ссылку на него, а старый остаётся без изменений. Если бы не JS-консоль и мой гениальный моск, я бы так и дальше думал.

но всё же, почему разработчики так не сделали? к примеру, хотелось бы делать так:

Это фишка производительности или что?
В текущем существующем случае для получения вышеописанного метода приходится делать так:

Что мешает расширить прототип?

А зачем? И так же работает
var a = [1,2,3,4];
var b = a.reverse();
console.log(b);

VM81:3 (4) [4, 3, 2, 1]

Прототипы - сила. Можно еще reverse() для String задать:

ошибка в последней строке
>);
надо убрать скобку перед ;

Илья спасибо за подробное объяснение, все это работает, а как насчет например если -123? чтобы вернуло -321?
вот мой код
var x = 123;
var reverse = function (x) var n = x.toString();
var rev = [];
for (var i = n.length-1; i >=0; i--) rev+=n[i]
>
return parseInt(rev)

ФУНКЦИЯ ВОЗВРАЩАЕТ ЗНАЧЕНИЕ - ЗНАЧИТ ПРОСТОЙ ЕЕ ВЫЗОВ НИЧЕГО НЕ ДАСТ!!
НАДО ПРИСВОИТЬ ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ ПЕРЕМЕННОЙ. Т.Е

а потом распечатать

и не обязательно в функции обьявлять переменную rev как массив,
так как вместо числа фунция вернет не число, а массив, что не есть хорошо.

т.е. окончательно код функции вместе с ее вызовом будет такая

var x = 123;
var reverse = function (x) var n = x.toString();
var rev = "";
for (var i = n.length-1; i >=0; i--) rev+=n[i];
return parseInt(rev);
>
document.write(x+"");
y=reverse(x);
document.write(y+"");

Могёт кто нибудь подсказать зачем нужны скобки у reverse()

потому что это метод, а не свойство ))

Помогите пожалуйста! Мне надо на JS написать функцию которая будет работать аналогично методу reverse() но н должна использовать данный метод

В этом уроке мы рассмотрим, как перевернуть массив в JavaScript. Есть несколько способов это сделать, всё зависит лишь от ваших предпочтений.

Мы перевернём эти два массива:

Используем Array.reverse()

Самый простой способ перевернуть массив – это метод reverse() :

Мы создали две переменные, чтобы указать на результирующие массивы:

Примечание: метод reverse() сразу меняет массив. Это означает, что исходные num_array и string_array меняются местами и исходная последовательность теряется.

Вам не нужно создавать новую переменную для хранения указателя на эти массивы в памяти, так как исходные указатели уже отсылают нас на перевернутые массивы:

Результат тот же:

Тем не менее, по-прежнему часто “присваивают” результат новой переменной для указания измененного состояния или присваивают показательное именя преобразованному массиву, например array_reversed .

Переворачиваем массив с помощью функционала

Функциональное программирование является прекрасным дополнением к большинству императивных языков программирования. Функциональные конструкции позволяют нам выполнять различные, даже сложные, преобразующие операции над объектами и последовательностями с помощью интуитивно понятных и простых инструкций.

Многие разработчики любят использовать функциональные конструкции, когда могут, поэтому неудивительно, что массива обычно переворачивается с помощью функциональных конструкций. Этот подход позволяет вам также добавлять или изменять элементы.

Чтобы функционально изменить массив в JavaScript, мы будем использовать оператор распространения и функцию map() :

Метод map() сопоставляет каждый извлеченный элемент (последний удалённый элемент) из numArr и помещает его в новый массив, который создается как копия numArr . Удалив последний элемент и добавив его в качестве первого в новый массив, мы создадим новый перевернутый массив.

В первым случае мы имеем дело с замороженной копией объекта numArr и, следовательно, не изменяем исходный массив.

Во втором случае мы изменяем исходный массив, поскольку используем ссылку на исходный массив в методе map() , даже если мы заранее создаем копию массива:

Таким образом, когда мы всё сделали, num_array остается неизменным, в то время как string_array исчез:

Переворачиваем массив с помощью цикла for

Наконец, можно просто запустить массив через цикл for в обратном порядке и добавить каждый элемент в новый массив.

Этот способ отлично подходит для создания нового перевёрнутого массива, но он не отменит старый. Если вы хотите изменить его, лучше использовать метод unshift() , чтобы добавить элементы в начале массива, соединение вы не отмените:

однако это не учитывает, когда [x+a] больше, чем длина массива. Я читал, что я должен хранить те, которые больше в другом массиве, но видя как a переменной я не уверен, что это лучшее решение. Спасибо заранее.

добавьте длину массива по модулю в код:

вы также должны создать новый Array для копирования, чтобы вы не перезаписывали значения, которые вам понадобятся позже.

Если вы не хотите изобретать колесо (может быть, это упражнение, но это может быть полезно знать), вы можете использовать Collections.rotate .

имейте в виду, что для этого требуется массив объектов, а не примитивный тип данных (иначе вы поменяете сами массивы в списке).

Arraycopy-дорогостоящая операция, как по времени, так и по памяти. Это был бы эффективный способ повернуть массив без использования дополнительного пространства, такого как принятый ответ.

другой способ-копирование с

Я думаю, что самый быстрый способ будет использовать система.arrayCopy() который является родным методом:

он повторно использует существующий массив. В некоторых случаях это может оказаться полезным. И последнее преимущество-размер временного массива меньше исходного массива. Таким образом, вы можете уменьшить использование памяти, когда a мал.

решение Java, завернутое в метод:

для левого поворота его очень просто

возьмите разницу между длиной массива и количеством позиций для сдвига.

2-й раз для индекса от 0 до kth

публичный статический тип int[] arrayLeftRotation(тип int[] а, инт Н тип int к) int[] resultArray = новый int[n];
инт сумма значений arrayindex = 0;
// первые индексы n-k будет заполнен в этом цикле
для(int i = k; i resultArray[arrayIndex] = a[i];
сумма значений arrayindex++;
>
// 2nd K индексы будут заполнены в этом цикле
для(Int J В=сумма значений arrayindex ; к resultArray[j]=a[j-(n-k)];
>
возвращение resultArray;
>

Читайте также: