Как инвертировать массив в java
Как реверсировать массив int в Java?
Я пытаюсь реверсировать массив int в Java.
Этот метод не реверсирует массив.
30 ответов:
Чтобы перевернуть массив int, вы меняете местами элементы до тех пор, пока не достигнете середины, например:
Таким образом, вы меняете местами каждый элемент дважды, так что результат будет таким же, как и в исходном списке.
В большинстве случаев гораздо быстрее и безопаснее придерживаться легко доступных библиотек, уже прошедших модульное тестирование и тестирование пользователями, когда они решают вашу проблему.
Я думаю, что немного легче следовать логике алгоритма, если вы объявляете явные переменные, чтобы отслеживать индексы, которые вы меняете на каждой итерации цикла.
Я также думаю, что это более читаемо, чтобы сделать это в цикле while.
Стоимость-это всего лишь создание одного объекта-списка, и никаких дополнительных библиотек не требуется.
Аналогичное решение было представлено в ответе Тарика и их комментаторов, но я думаю, что этот ответ был бы более кратким и более легко разбираемым.
Здесь уже есть много ответов, в основном сосредоточенных на изменении массива на месте. Но для полноты картины, вот еще один подход, использующий потоки Java для сохранения исходного массива и создания нового обратного массива:
Вот как я лично решил бы эту проблему. Причина создания параметризованного метода заключается в том, чтобы разрешить сортировку любого массива. не только ваши целые числа.
Надеюсь, ты что-нибудь почерпнешь из него.
Наиболее эффективно просто перебирать массив в обратном порядке.
Я не уверен, что решение Аарона делает это vi этот вызов Collections.reverse(list); кто-нибудь знает?
Если вы работаете с более примитивными данными (например, char, byte, int и т. д.), то вы можете выполнять некоторые забавные операции XOR.
В случае Java 8 мы также можем использовать потоки для реверса массива целых чисел как:
Вот простое и быстрое решение. Надеюсь, это поможет!.
Не было бы гораздо более маловероятным ошибиться, делая это таким образом?
Ниже приведена полная программа для запуска на вашем компьютере.
Используя решение XOR, чтобы избежать переменной temp ваш код должен выглядеть как
Смотрите эту ссылку для лучшего объяснения:
Здесь простая реализация, чтобы обратить массив любого типа, плюс полная/частичная поддержка.
Вот соответствующий модульный тест
Решение с o(n) временной сложностью и O(1) пространственной сложностью.
Есть два способа решить эту проблему:
1. Переверните массив в пространстве.
Шаг 1. Поменяйте местами элементы в начале и конце индекса.
Шаг 2. Увеличьте начальный индекс уменьшите конечный индекс.
Пример кода для обращения массива в пространстве: например:
2. Реверсируйте массив, используя вспомогательный массив.
Шаг 1. Создайте новый массив размером, равным заданному массиву.
Шаг 2. Вставить элементы в новый массив, начиная с начального индекса, из данный массив начинается с конечного индекса.
Для этого временная сложность будет O (n), а пространственная сложность-O (n)
Пример кода для реверсирования массива с помощью вспомогательного массива выглядит следующим образом:
Кроме того, мы можем использовать Для этого нужно собрать API из Java.
API коллекций внутренне использует тот же обратный подход в пространстве.
Пример кода для использования API коллекций выглядит следующим образом:
Как инвертировать массив в java
Один из популярнейших вопросов на интервью для java-девелопера это просьба перевернуть массив. Это очень похоже на вопрос из прошлой статьи, про переворачивание строки, но немного про другое. Вопрос не выглядит сложным, все что нужно сделать это создать новый массив такого же размера, перебрать исходный массив от конца до нажала заполняя новый. Все, готово. Но нет, мы же создали дополнительный массив того же размера, что и исходный, что усложняет наше решение O(n). Мы не сможем использовать наше решение, если размер массива очень большой (например 10 млн элементов), а размер heap небольшой. Что мы можем тут сделать? Как улучшить наше решение? Можем ли мы перевернуть массив не создавая дополнительный буффер? Для нашей задачи предположим, что у нас массив из integer (вообще на интервью хорошая практика задавать правильные вопросы в правильных местах, как говорят знающие люди это черта хорошего программиста). Ключевое тут понять, что вам нужно перевернуть исходный массив, мы не можем использовать другой массив, но использовать одну две дополнительные переменные, вполне допустимо. Так же недопустимо использование сторонних библиотек или Java API которые могут сделать эту работу за нас, а также методов класса java.util.Arrays, за исключением Arrays.toString() чтобы выводить массивы. Когда наши требования выяснены приступим к решению задачи.
Первое что приходит в голову это перебрать все элементы массива и поменять их местами. Первый элемент и последний, второй элемент с предпоследним, и т.д. В этом случае все элементы массивы будут перевернуты без использования дополнительного буффера. Ключевая вещь здесь, которую нужно держать в голове это только что нам нужно менять местами элементы до того момента как мы достигнем середины массива, иначе мы получим тот же самый массив. Возникает закономерный вопрос, а что если массив имеет четное количество элементов? В этом случае в середине массива будут два элемента, и нам нужно поменять их местами, поэтому наше условие перебора будет содержать выражение index
Как обратить вспять массив в Java
Изучите несколько подходов к инвертирования массивов в Java.
1. Обзор
В этой быстрой статье мы покажем как мы можем инвертировать массив в Java.
Мы увидим несколько различных способов сделать это с помощью чистых Java 8-основанных решений – некоторые из них мутировать существующий массив, а некоторые создать новый.
2. Определение проблемы
Основная идея заключается в том, чтобы изменить порядок элементов в массиве. Итак, если данный массив:
Мы хотели бы получить:
Давайте посмотрим, как мы можем это сделать.
3. Использование традиционных для петли
Первый способ, который мы могли бы подумать о инвертировать массив с помощью для петля:
Как мы видим, код итерирует через половину массива, изменяя элементы в симметричных положениях.
Мы используем временную переменную, чтобы не потерять значение текущего положения массива во время итерации.
4. Использование API Java 8 Stream
Мы также можем инвертировать массив с помощью API Stream:
Здесь мы используем метод IntStream.диапазон для создания последовательного потока чисел. Затем мы сопоставим эту последовательность на индексы массивов в порядке убывания.
5. Использование Collections.reverse()
Давайте посмотрим, как инвертировать массив с помощью Collections.reverse () метод:
По сравнению с предыдущими примерами, это более читаемый способ выполнения задачи.
6. Использование Apache Commons Ланг
Другой вариант инвертировать массив заключается в использовании Апач Викисклад Ланг библиотека. Чтобы использовать его, мы должны сначала включить библиотеку в качестве зависимости:
Давайте использовать ArrayUtils класс для инвертировать массив:
Как мы видим, это решение довольно простое.
7. Использование Google Гуава
Тогда мы можем использовать обратный метод в Гуава Списки класс для инвертировать массив:
8. Заключение
Все образцы кода, показанные здесь, могут быть найдено на GitHub – это проект Maven, поэтому его легко импортировать и запускать в том же объеме.
Как поменять элементы массива в обратном порядке в Java
Данная статья написана командой Vertex Academy. Это одна из статей из нашего «Самоучителя по Java.»
Напишите программу, которая меняет местами элементы одномерного массива из String в обратном порядке. Не используйте дополнительный массив для хранения результатов.
Решение:
Комментарии к задаче:
Тут есть a[i] и малопонятное a[n-i-1]. Но на самом деле n-i-1 это просто формула для определения «противоположного» элемента массива:
Если бы мы имели массив, который бы состоял из элементов a, b, c, d, e и f, то есть массив из 6 элементов (n=6), «противоположным» (то есть элементом a[n-i-1]) для каждого из них были бы f для a, e для b и d для c. Цикл из фрагмента кода выполнялся бы три раза, до элемента d (i=0, 1, 2). Граница выполнения массива показана оранжевой линией на рисунке.
Так, обратите внимание, что мы не должны проходить циклом весь массив, чтобы поменять его элементы местами.
Развернуть массив задом наперед?
5 ответов 5
Вы затираете одни элементы другими из того же массива:
С новым массивом еще проще:
В первой(и последующих) итерациях цикла, заменяемое число просто затирается заменяющим, а должно попадать на его место. Т.е. когда пятерка из конца попадает в начало, то единица не попадает на место пятерки, а должна.
Еще один небольшой пример в копилку
Всё ещё ищете ответ? Посмотрите другие вопросы с метками java массивы или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.12.22.41046
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.