2012-04-03 3 views
19

Я пытаюсь изменить порядок массива в 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; ? 

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

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

+2

Это домашнее задание? Если да, отметьте как таковой. –

+2

рассмотрите возможность перестановки первого и последнего предметов, а затем второго и второго последних предметов, пока вы не достигнете половины списка ...вам просто понадобится одна временная переменная и по-прежнему будет переходить по списку один раз? –

+2

http://stackoverflow.com/questions/2137755/how-do-reverse-an-int-array-in-java –

ответ

53

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

+4

+1 Действительно, поскольку OP теперь говорит, что это не домашнее задание, это отличный ответ. –

+0

Любовь решение. Просто подтвердил, что временного массива не требуется: http://ideone.com/api/embed.js/link/xLLTpl ... нажмите «Клонировать», а затем «Запустить» – eddyparkinson

+0

Не работает, по крайней мере, с Java 1.6: System.out.println (X [0] + "to" + X [X.length - 1]); \t \t \t Collections.reverse (Arrays.asList (X)); \t \t \t System.out.println (X [0] + "to" + X [X.length - 1]); отпечатки: 2272.6270739116 до 186.704625250768 2272.6270739116 до 186.704625250768 –

10

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

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

вы можете сделать это без необходимости ТЕмпа массива

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

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

0

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

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

Это не похоже на Java. – ceving

+2

следовательно 'pseudocode' – mcfinnigan

1

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

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

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

GetValueAt(int i){return array[N - i];} 
0

Позволяет рассматривать массив из массива Integer, то мы могли бы также искать решения, как этот

обр - массив Integer

for(int i=0,int J<arr.length-1 ; i<j ; i++,j--) 
{ 
    temp =a[i]; 
    a[i]=a[j]; 
    a[j]=temp; 
} 
-2

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

ArrayList<Element> YourTempElement= new ArrayList<Element>(mElements); 
Collections.reverse(YourTempElement); 
+0

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

+0

нет необходимости объяснять брату, это немного два шага и я не объясняю. – Darshan

+0

Хорошие ответы на переполнение стека объясняют вещи. Принятый ответ. Если уже есть хороший ответ, который говорит то же самое, что и вы, или если вообще нет хорошего ответа, нет никакого смысла добавлять ответ на вопрос: это просто добавляет шум. –

Смежные вопросы