Обратный порядок массивов - PullRequest
19 голосов
/ 03 апреля 2012

Я пытаюсь изменить порядок массива в Java.
Какой самый эффективный способ сделать это в O (n) с наименьшим количеством используемой памяти.
Не нужно отвечать кодом, псевдокод будет хорошо.
Вот мой мыслительный процесс:

  create a new temp array //I think this is a waste of memory, 
                          //but I am not sure if there's a better way
 grab elements from the end of the original array -decrement this variable
 insert element in beginning of temp array -increment this variable
then make the original array point to the temp array? //I am not sure 
            //if I can do this in java; so let's say the 
            //original array is Object[] arr; and the temp array is 
            //Object[] temp. Can I do temp = arr; ?

Есть ли лучший, более эффективный способ сделать это, возможно, без использования временного массива?И наконец, предположим, что в массиве нет нулей, поэтому все может работать.Спасибо

Редактировать: нет, это не домашнее задание.

Ответы [ 8 ]

53 голосов
/ 03 апреля 2012

Если это массив объектов, то Collections.reverse(Arrays.asList(array)) выполнит работу с постоянной памятью и линейным временем - временный массив не требуется.

12 голосов
/ 03 апреля 2012

Вам не нужно использовать временный массив;просто пройдитесь по массиву от начала до середины, поменяв элемент на i на элемент на array.length-i-1.Убедитесь, что правильно обращаетесь со средним элементом (это не сложно, но обязательно.)

11 голосов
/ 03 апреля 2012

Использовать один временный элемент.

int array[SIZE];
int temp;

for (int i = 0; i < SIZE/2; i++)
  {
     temp = array[i];
     array[i] = array[SIZE-1 - i];
     array[SIZE-1 - i] = temp;
  }
3 голосов
/ 03 апреля 2012

вы можете сделать это без необходимости временного массива

  • цикл от начала (или конца не имеет значения) до середины массива
  • поменять элемент с элементом at (последний элемент - индекс) (т. Е. 0 и size - 1, 1 и size - 2 и т. Д.)
  • вы сделаете что-то подобное, чтобы поменять местами:
    temp = a[i];
    a[i] = a[end-i];
    a[end-i] = temp;
  • повтор
1 голос
/ 03 апреля 2012

Вот два решения:

    loop to N/2
      swap each element at i with element at N - i

Другим решением является (в зависимости от ваших обстоятельств) фальшивое обращение массива путем индексации:

    GetValueAt(int i){return array[N - i];}
0 голосов
/ 21 июня 2017

Вы можете сделать это всего за два шага

ArrayList<Element> YourTempElement= new ArrayList<Element>(mElements);
Collections.reverse(YourTempElement);
0 голосов
/ 20 апреля 2015

Давайте рассмотрим массив из массива Integer, тогда мы могли бы также найти решение, подобное этому

arr - массив из Integer

for(int i=0,int J<arr.length-1 ; i<j ; i++,j--)
{
    temp =a[i];
    a[i]=a[j];
    a[j]=temp;
 }
0 голосов
/ 03 апреля 2012

псевдокод, предполагая массивы индекса на основе 0:

for i in range(0, len(array)/2):
     swap(array[i], array[(len(array)-1)-i])
...