2012-04-03 11 views
19

Próbuję odwrócić kolejność tablicy w języku Java.
Jaki jest najskuteczniejszy sposób zrobienia tego w trybie O (n) z najmniejszą ilością pamięci.
Nie trzeba odpowiadać za pomocą kodu, pseudo kod będzie w porządku.
Oto mój proces myślowy:Reverse Array Order

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; ? 

Czy istnieje lepszy bardziej efektywny sposób to zrobić, być może bez użycia tablicy temp? i Na koniec załóżmy, że w tablicy nie ma żadnych zer, więc wszystko może działać. Dziękujemy

Edytuj: nie, to nie jest praca domowa.

+2

Czy to zadanie domowe? Jeśli tak, proszę oznaczyć je jako takie. –

+2

rozważ swapy jako pierwsze i ostatnie elementy, a następnie drugie i drugie ostatnie pozycje, aż osiągniesz połowę listy ...potrzebujesz tylko jednej zmiennej tymczasowej i nadal będziesz przeglądał listę raz? –

+2

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

Odpowiedz

53

I f to tablica obiektów, a następnie Collections.reverse(Arrays.asList(array)) wykona zadanie ze stałą pamięcią i czasem liniowym - nie jest wymagana żadna tymczasowa tablica.

+4

+1 Rzeczywiście, ponieważ PO mówi teraz, że to nie jest praca domowa, jest to świetna odpowiedź. –

+0

Uwielbiam rozwiązanie. Po prostu potwierdziłem, że nie jest wymagana żadna tymczasowa tablica: http://ideone.com/api/embed.js/link/xLLTpl ... kliknij "Klonuj", a następnie "Uruchom" – eddyparkinson

+0

Nie działa, przynajmniej w Javie 1.6: System.out.println (X [0] + "to" + X [X. length - 1]); \t \t \t Collections.reverse (Arrays.asList (X)); \t \t System.out.println (X [0] + "to" + X [X.length - 1]); wydruków: 2272.6270739116 do 186.704625250768 2272.6270739116 do 186.704625250768 –

10

Użyj pojedynczego elementu tymczasowego.

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

można to zrobić bez konieczności tablicy temp

  • pętli od początku (lub końca nie ma znaczenia) do środkowej części tablicy
  • wymiany elementu z elementem na (ostatnia element - index) (tak, 0 i size - 1, 1 i size - 2 etc)
  • zrobisz coś takiego, aby zamienić:
 
    temp = a[i]; 
    a[i] = a[end-i]; 
    a[end-i] = temp; 
  • powtórz
12

Nie trzeba używać tymczasową tablicę; wystarczy przejść przez tablicę od początku do połowy, zamieniając element na i dla elementu na array.length-i-1. Upewnij się, że prawidłowo obsługiwać element środkowy (nie trudne do zrobienia, ale zrobić upewnić.)

0

pseudokod, zakładając tablic 0 opartego-index:

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

To nie wygląda jak Java. – ceving

+2

stąd "pseudokod" – mcfinnigan

1

Oto dwa rozwiązania:

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

Innym rozwiązaniem jest (w zależności od okoliczności) fałszywe odwracania macierzy przez indeksowanie:

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

Pozwala rozważyć tablica jest tablicą Integer wtedy moglibyśmy również szukać takiego rozwiązania

arr - tablicę 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

Można to zrobić w zaledwie dwóch krokach

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

Używa tych samych metod, co akceptowana odpowiedź, tylko mniej elegancko iz mniejszym wyjaśnieniem. –

+0

nie ma potrzeby wyjaśniania, ponieważ jest to mały krok i nie jestem tłumaczem. – Darshan

+0

Dobre odpowiedzi w Stack Overflow wyjaśniają rzeczy. Przyjęta odpowiedź brzmi. Jeśli istnieje już dobra odpowiedź, która mówi to samo, co chcesz, lub jeśli nie ma sposobu, aby napisać dobrą odpowiedź w ogóle, nie ma prawdziwego sensu w dodawaniu odpowiedzi na pytanie: to po prostu dodaje szumu. –