2012-04-03 7 views
19

Estoy intentando invertir el orden de una matriz en Java.
¿Cuál es la forma más eficiente de hacerlo en O (n) con la menor cantidad de memoria utilizada?
No hay necesidad de responder con código, el pseudo código estará bien.
Aquí es mi proceso de pensamiento: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; ? 

¿Hay una manera mejor y más eficiente de hacer esto tal vez sin el uso de una matriz temporal? y, por último, suponga que no hay nulos en la matriz, por lo que todo puede funcionar. Gracias

Editar: no, esto no es tarea.

+2

¿Es esta tarea? En caso afirmativo, etiquetado como tal. –

+2

considere cambiar los artículos primero y último y luego los segundos y segundos últimos hasta llegar a la mitad de la lista ...solo necesitará una variable temporal y aún revisará la lista una vez? –

+2

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

Respuesta

53

I f es una matriz de Objetos, entonces Collections.reverse(Arrays.asList(array)) hará el trabajo con memoria constante y tiempo lineal, no se requiere una matriz temporal.

+4

+1 De hecho, dado que OP ahora dice que esto no es tarea, esta es una gran respuesta. –

+0

Me encanta la solución. Confirmado que no se requiere una matriz temporal, consulte: http://ideone.com/api/embed.js/link/xLLTpl ... haga clic en "Clonar" y luego "Ejecutar" – eddyparkinson

+0

No funciona, al menos con Java 1.6: System.out.println (X [0] + "a" + X [X.length - 1]); \t \t \t Collections.reverse (Arrays.asList (X)); \t \t \t System.out.println (X [0] + "a" + X [X.length - 1]); grabados: 2272.6270739116 a 186.704625250768 2272.6270739116 a 186.704625250768 –

10

Use un solo elemento de temperatura.

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

puede hacerlo sin necesidad de una gama de temperatura

  • bucle desde el principio (o al final no importa) a la mitad de la matriz
  • elemento de intercambio con el elemento al (última elemento - índice) (por lo que 0 y size - 1, 1 y size - 2 etc)
  • que va a hacer algo como esto para intercambiar:
 
    temp = a[i]; 
    a[i] = a[end-i]; 
    a[end-i] = temp; 
  • repetición
12

No es necesario utilizar una matriz temporal; simplemente recorra el conjunto desde el principio hasta la mitad, intercambiando el elemento al i para el elemento al array.length-i-1. Asegúrese de que el asa del elemento medio correctamente (no es difícil de hacer, pero asegúrese.)

0

pseudocódigo, asumiendo matrices 0-índice basado:

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

Esto no se parece a Java. – ceving

+2

por lo tanto 'pseudocode' – mcfinnigan

1

He aquí dos soluciones:

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

Otra solución es (dependiendo de sus circunstancias) falso inversión de la matriz mediante la indexación:

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

consideremos la matriz es del conjunto de enteros entonces también podríamos buscar una solución como esta

arr - conjunto de enteros

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

Usted puede hacer esto en sólo dos pasos

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

Utiliza los mismos métodos que la respuesta aceptada, con menos elegancia y menos explicación. –

+0

no hay necesidad de explicación porque es un pequeño paso dos y no soy explicador. – Darshan

+0

Las buenas respuestas en Stack Overflow explican cosas. La respuesta aceptada sí. Si ya hay una buena respuesta que diga lo mismo que usted, o si no hay forma de escribir una buena respuesta, no tiene sentido agregar una respuesta a la pregunta: eso solo agrega ruido. –