Wie kann ich ein int-Array in Java umkehren?

238

Ich versuche, ein int-Array in Java umzukehren.

Diese Methode kehrt das Array nicht um.

for(int i = 0; i < validData.length; i++)
{
    int temp = validData[i];
    validData[i] = validData[validData.length - i - 1];
    validData[validData.length - i - 1] = temp;
}

Was ist daran falsch?

MichaelScott
quelle
31
Ich sehe, was ich falsch gemacht habe. Sollte validData.length / 2 sein. Andernfalls kehrt es sich um und hebt sich dann wieder auf.
MichaelScott
4
Siehe en.wikipedia.org/wiki/In-place_algorithm, das eine Beschreibung der korrekten Version dieses Algorithmus enthält.
Dean Povey

Antworten:

283

Um ein int-Array umzukehren, tauschen Sie Elemente wie folgt aus, bis Sie den Mittelpunkt erreichen:

for(int i = 0; i < validData.length / 2; i++)
{
    int temp = validData[i];
    validData[i] = validData[validData.length - i - 1];
    validData[validData.length - i - 1] = temp;
}

So wie Sie es tun, tauschen Sie jedes Element zweimal aus, sodass das Ergebnis mit der ursprünglichen Liste übereinstimmt.

3lectrologos
quelle
Und ich möchte einen validData.length / 2Teil außerhalb der for-Schleife platzieren.
Jin Kwon
7
@ Jin würde ich nicht. Es verschleiert nur die Bedeutung, und ich wette, der optimierende Compiler würde es trotzdem für Sie tun. Unabhängig davon macht eine Mikrooptimierung keinen Sinn, bis Sie durch die Profilerstellung eindeutige Beweise dafür erhalten, dass dies notwendig / hilfreich ist.
Nicu Stiurca
9
@ JinKwon Das wäre so ähnlich validData.length >> 1. Das ist gleichwertig und schneller, aber es verwirrt viele Programmierer und jeder gute Compiler wird das automatisch tun.
Justin
2
Sie sollten diese Berechnung nur einmal durchführen validData.length - i - 1und in einer Variablen speichern.
Kann jemand eine Umkehrung ohne Temperaturvariable vorschlagen !!
SG28
303

Mit Commons.Lang können Sie einfach verwenden

ArrayUtils.reverse(int[] array)

In den meisten Fällen ist es schneller und fehlerfreier, sich an leicht verfügbare Bibliotheken zu halten, die bereits auf Einheiten getestet und vom Benutzer getestet wurden, wenn sie sich um Ihr Problem kümmern.

Manur
quelle
3
Ich hätte es vorgezogen, wenn es das umgekehrte (übergebene) Array für einen funktionalen Stil zurückgegeben hätte.
Laurent G
2
@ laurent-g um fair zu sein: das Array auf diese Weise umzukehren ist speichereffizienter, weshalb sie es wahrscheinlich so gemacht haben.
Sirmyself
4
Mein Punkt war nicht die Kopie oder nicht Kopie. Meine Nachricht besagt, dass "(übergeben)" zurückgegeben werden soll (nachdem sie rückgängig gemacht wurde), sodass sie in einem Ausdruck übergeben werden kann, ohne dass eine separate Anweisung erforderlich ist.
Laurent G
52
public class ArrayHandle {
    public static Object[] reverse(Object[] arr) {
        List<Object> list = Arrays.asList(arr);
        Collections.reverse(list);
        return list.toArray();
    }
}
Tarik
quelle
11
Natürlich wird es. Eine Liste kann nur Objekte enthalten, keine Grundelemente. Daher werden alle Grundelemente ( intin diesem Fall) in ihre jeweiligen Umbruchzeichen ( Integerin diesem Fall) eingeschlossen und in die Liste aufgenommen. Sie sehen, Integers sind Objekte. @ Tom
11684
6
Achtung: Wenn ich mich nicht irre, wird das ursprüngliche Array geändert. Um dies zu verdeutlichen, möchten Sie möglicherweise nichts zurückgeben.
Andrea Zilio
3
@ 11684 Ja, generische Listen können nur Objekte enthalten. Die Methode nimmt jedoch ein Array aus. Arrays können Grundelemente enthalten. Daher int[]ist anders als Integer[]. Probieren Sie es aus : Integer[] array = new int[5]. Sie erhalten einen Kompilierungsfehler. Aus diesem Grund Arraysdefiniert die Java- Klasse eine Reihe von Methoden für die Arbeit mit primitiven Arrays. Der Versuch, eine int[]an die obige Methode zu übergeben, führt zu so etwas wie The method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[]). @Filip - Ein In-Place-Algorithmus benötigt weniger Speicher und läuft schneller.
Brian McCutchon
3
@Andrea Eigentlich ist es nicht. Die von zurückgegebene Liste Arrays.asList()verweist weder auf das ursprüngliche Array noch auf das zurückgegebene Array. Dies ist eines der Probleme bei dieser Methode: Sie verwendet den dreifachen Speicher und verdreifacht die Arbeit als In-Place-Algorithmus.
Brian McCutchon
4
Diese Methode selbst könnte funktionieren, aber man kann int[]dieser Methode einfach kein Argument übergeben ( "inkompatible Typen: int [] kann nicht in Object [] konvertiert werden" ).
MC Emperor
47
Collections.reverse(Arrays.asList(yourArray));

java.util.Collections.reverse()kann java.util.Lists umkehren und java.util.Arrays.asList()gibt eine Liste zurück, die das spezifische Array umschließt, das Sie an es übergeben, und wird daher yourArraynach dem Aufruf von umgekehrt Collections.reverse().

Die Kosten sind nur die Erstellung eines Listenobjekts und es sind keine zusätzlichen Bibliotheken erforderlich.

Eine ähnliche Lösung wurde in der Antwort von Tarik und ihren Kommentatoren vorgestellt, aber ich denke, diese Antwort wäre prägnanter und leichter zu analysieren.

Escitalopram
quelle
14
Für Arrays von Objekten ist dies eine gute Lösung. Bei Arrays von Grundelementen funktioniert dies jedoch nicht. Z.B. Wenn Sie ein int[]an übergeben, asList(...)wird nicht ein List<Integer>, sondern ein a zurückgegeben List<int[]>, das ein Element enthält. Es gibt AFAICS keine einfache integrierte Möglichkeit, ein int[]in ein zu konvertieren Integer[].
Martin Rust
4
Dies funktioniert nicht mit primitiven Arrays ... Sammlungen geben keinen Wert zurück, so dass Sie jetzt ein nutzloses Array als Liste im Speicher haben
NightSkyCode
@MartinRust Java 8+: Arrays.stream(arr).boxed().collect(Collectors.toList())oderArrays.stream(arr).boxed().toArray(Integer[]::new)
Simon Forsberg
39

Ich denke, es ist ein bisschen einfacher, der Logik des Algorithmus zu folgen, wenn Sie explizite Variablen deklarieren, um die Indizes zu verfolgen, die Sie bei jeder Iteration der Schleife austauschen.

public static void reverse(int[] data) {
    for (int left = 0, right = data.length - 1; left < right; left++, right--) {
        // swap the values at the left and right indices
        int temp = data[left];
        data[left]  = data[right];
        data[right] = temp;
    }
}

Ich denke auch, dass es besser lesbar ist, dies in einer while-Schleife zu tun.

public static void reverse(int[] data) {
    int left = 0;
    int right = data.length - 1;

    while( left < right ) {
        // swap the values at the left and right indices
        int temp = data[left];
        data[left] = data[right];
        data[right] = temp;

        // move the left and right index pointers in toward the center
        left++;
        right--;
    }
}
Bill die Eidechse
quelle
Old-School-Swap sieht einfacher aus, aber ja, wenn Array-Indexwerte links, rechts, ... verwendet werden, ist dies hilfreich für das Debuggen, falls vorhanden
Srinath Ganesh
Sie können auch 'public static void swap (int [] data, int index1, int index2) {...}' hinzufügen und dies von 'reverse' wie folgt verwenden: swap (data, left, right).
pm_
13

Hier gibt es bereits viele Antworten, die sich hauptsächlich auf die Änderung des Arrays vor Ort konzentrieren. Der Vollständigkeit halber gibt es hier einen anderen Ansatz, bei dem Java-Streams verwendet werden, um das ursprüngliche Array beizubehalten und ein neues umgekehrtes Array zu erstellen:

    int[] a = {8, 6, 7, 5, 3, 0, 9};
    int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();
Patrick Parker
quelle
10

Mit Guave:

Collections.reverse(Ints.asList(array));
ZhekaKozlov
quelle
4
Das ist brilliant! Kurz und effektiv. Wie bei allen asListMethoden wird eine Ansicht erstellt , die direkt in das Hintergrundarray (primitiv) schreibt. Ich denke, der Down-Wähler hier hat fälschlicherweise gedacht, dass dies eine Box-Liste oder so etwas zurückgibt.
Luke Usherwood
@LukeUsherwood Vermutlich entsteht beim Aufrufen von get und set für jedes Element noch ein gewisser Aufwand durch Boxen und Unboxing. Aber ich stimme Ihnen zu, dass dies eine brillante Lösung ist.
Patrick Parker
Das ist es wert, sich dessen bewusst zu sein. Ich denke nicht, dass es bei den meisten Codes, mit denen ich persönlich arbeite, eine große Sache wäre - unsere "heißen" Bereiche sind gut definiert, der Rest ist eine Art "Klebercode". Gleichzeitig bin ich mir bewusst, dass die Speicherabwanderung zusätzliche "versteckte" Kosten verursacht, die Profiler der eigentlichen Funktion nicht zuschreiben.
Luke Usherwood
@LukeUsherwood gibt immer noch eine Box-Liste anstelle eines Prim-Arrays zurück
AnthonyJClink
2
@AnthonyJClink Nicht sicher, worauf sich "es" bezieht, aber das JDK-Dienstprogramm Collections.reverseist eine ungültige Methode. Dies funktioniert direkt an einer internen Guava-Klasse, die eine umschließt int[](Da darin niemals eine Liste von Boxen Integergespeichert wird, würde ich die Klasse nicht als "Boxed List", sondern als "Listenansicht eines Arrays" bezeichnen). Aber ja, es funktioniert über eine Schnittstelle, die IntegerObjekte weitergibt, so dass dies, wie erwähnt, eine Menge temporärer Objektabwanderung und Boxen verursachen würde. Probieren Sie eine IntStreamoder eine Bibliothek mit primitiven Sammlungen aus, um herauszufinden, wo Leistung wichtig ist. (Trove, Koloboke, Eclipse Collections, ...)
Luke Usherwood
9

Im Fall von Java 8 können wir IntStreamdas Array von Ganzzahlen auch wie folgt umkehren:

int[] sample = new int[]{1,2,3,4,5};
int size = sample.length;
int[] reverseSample = IntStream.range(0,size).map(i -> sample[size-i-1])
                      .toArray(); //Output: [5, 4, 3, 2, 1]
akhil_mittal
quelle
7

Einfach für Schleife!

for (int start = 0, end = array.length - 1; start <= end; start++, end--) {
    int aux = array[start];
    array[start]=array[end];
    array[end]=aux;
}
Apetrei Ionut
quelle
4
Bitte teilen Sie dem Fragesteller in Zukunft genau mit, was er falsch gemacht hat und was Sie richtig gemacht haben.
Kartik Chugh
1
Wechsel start <= endzustart < end
Leonard Pauli
5

Das wird dir helfen

int a[] = {1,2,3,4,5};
for (int k = 0; k < a.length/2; k++) {
    int temp = a[k];
    a[k] = a[a.length-(1+k)];
    a[a.length-(1+k)] = temp;
}
Krishna Kumar Chourasiya
quelle
5
for(int i=validData.length-1; i>=0; i--){
  System.out.println(validData[i]);
 }
Deepak Singh
quelle
Leider ist dies die sauberste Antwort, die hier verfügbar ist, da jeder Entwickler weiß, wie es geht, und keine erweiterten Paketinstallationen erforderlich sind.
HoldOffHunger
4

So würde ich es persönlich lösen. Der Grund für die Erstellung der parametrisierten Methode besteht darin, dass jedes Array sortiert werden kann - nicht nur Ihre Ganzzahlen.

Ich hoffe du lernst etwas daraus.

@Test
public void reverseTest(){
   Integer[] ints = { 1, 2, 3, 4 };
   Integer[] reversedInts = reverse(ints);

   assert ints[0].equals(reversedInts[3]);
   assert ints[1].equals(reversedInts[2]);
   assert ints[2].equals(reversedInts[1]);
   assert ints[3].equals(reversedInts[0]);

   reverseInPlace(reversedInts);
   assert ints[0].equals(reversedInts[0]);
}

@SuppressWarnings("unchecked")
private static <T> T[] reverse(T[] array) {
    if (array == null) {
        return (T[]) new ArrayList<T>().toArray();
    }
    List<T> copyOfArray = Arrays.asList(Arrays.copyOf(array, array.length));
    Collections.reverse(copyOfArray);
    return copyOfArray.toArray(array);
}

private static <T> T[] reverseInPlace(T[] array) {
    if(array == null) {
        // didn't want two unchecked suppressions
        return reverse(array);
    }

    Collections.reverse(Arrays.asList(array));
    return array;
}
AnthonyJClink
quelle
2
Löst das ursprüngliche Problem nicht mit Primativen.
Melinda Green
Es gibt viele Möglichkeiten, Prims in Objekte umzuwandeln. Ich empfehle immer, Prims in Java zu vermeiden, wo immer dies möglich ist, und ich glaube auch, dass dies gefördert werden sollte.
AnthonyJClink
Das Konvertieren eines Arrays von Grundelementen unbekannter Länge in ein Array ist möglicherweise eine sehr schlechte Idee, insbesondere wenn dies nicht bemerkt wird. Java ist kein Smalltalk. Primitive sind Teil der Sprache und haben ihren Platz. Es spielt keine Rolle, ob wir sie nicht mögen, wir müssen sie akzeptieren und gegebenenfalls verwenden.
Melinda Green
1
Sie müssen das Array eigentlich nicht kopieren, nur Collections.reverse(asList(arraytoReverse)); return arrayToReverse;. asListist nur ein Wrapper um das Array, daher wird das ursprüngliche Array umgekehrt.
Radiodef
3

Ihr Programm funktioniert nur für length = 0, 1. Du kannst es versuchen :

int i = 0, j = validData.length-1 ; 
while(i < j)
{
     swap(validData, i++, j--);  // code for swap not shown, but easy enough
}
fastcodejava
quelle
3
Vielleicht haben Sie Swap als Pseudocode für einen Inline-Swap anstatt für einen Methodenaufruf gemeint, aber wenn nicht, funktioniert das nicht. Java wird als Referenz übergeben, sodass es nicht möglich ist, eine Swap-Methode für Variablen zu schreiben.
Dean Povey
Ich meinte, wie auch immer Sie v [i] & v [j] zum Tauschen bringen können. Mir ist bekannt, wie Methodenaufrufe in Java funktionieren. Für die Methode können Sie so etwas wie Swap ausführen (v, i ++, j--);
Fastcodejava
1
Dean, das Array validData ist ein Objekt, das als Referenz übergeben wird, sodass die swap () -Methode einwandfrei funktioniert.
Gaël Oberson
3

Wenn Sie mit Daten arbeiten, die primitiver sind (z. B. char, byte, int usw.), können Sie einige unterhaltsame XOR-Operationen ausführen.

public static void reverseArray4(int[] array) {
    int len = array.length;
    for (int i = 0; i < len/2; i++) {
        array[i] = array[i] ^ array[len - i  - 1];
        array[len - i  - 1] = array[i] ^ array[len - i  - 1];
        array[i] = array[i] ^ array[len - i  - 1];
    }
}
Absolut blau
quelle
1
Zu süß, um es tatsächlich im Produktionscode zu verwenden, aber trotzdem lustig. Verwenden Sie für maximale Niedlichkeit die Operation% = wie folgt: Array [i]% = Array [len - i - 1] usw.
Melinda Green
Ähnlich, aber etwas kürzer:for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
Thomas Mueller
2

Am effizientesten ist es, das Array einfach rückwärts zu iterieren.

Ich bin mir nicht sicher, ob Aarons Lösung dies tut. Collections.reverse(list);Weiß jemand Bescheid?

Nick Strupat
quelle
Um rückwärts über das Array zu iterieren, ist ein neues Array erforderlich. Ich mag die oben beschriebene Lösung, die die Inline-Umkehrung durchführt, ohne ein neues Array zu erstellen.
mmcdole
1
@ Simucal warum ein neues Array erstellen? Iterieren Sie es einfach rückwärts.
Trejkaz
2
public void getDSCSort(int[] data){
        for (int left = 0, right = data.length - 1; left < right; left++, right--){
            // swap the values at the left and right indices
            int temp = data[left];
            data[left]  = data[right];
            data[right] = temp;
        }
    }
Amicos
quelle
1
public void display(){
  String x[]=new String [5];
  for(int i = 4 ; i > = 0 ; i-- ){//runs backwards

    //i is the nums running backwards therefore its printing from       
    //highest element to the lowest(ie the back of the array to the front) as i decrements

    System.out.println(x[i]);
  }
}
Geisterprogrammierer
quelle
1
Ja, ich habe versucht, den gleichen und klaren Code zusammen mit der Ausgabe ist int [] a = {1,3,5,2,6,7}; for (int i = a.length-1; i> = 0; i--) {System.out.print (a [i] + "");} `es wird das Array vom letzten Index zum ersten Index umkehren
Rocket_03
1

Wäre es nicht viel unwahrscheinlicher, dies auf diese Weise zu tun?

    int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int[] temp = new int[intArray.length];
    for(int i = intArray.length - 1; i > -1; i --){
            temp[intArray.length - i -1] = intArray[i];
    }
    intArray = temp;
ModDL
quelle
1

Lösung mit o (n) Zeitkomplexität und o (1) Raumkomplexität.

void reverse(int[] array) {
    int start = 0;
    int end = array.length - 1;
    while (start < end) {
        int temp = array[start];
        array[start] = array[end];
        array[end] = temp;
        start++;
        end--;
    }
}
user11016
quelle
Nur zu Ihrer Information, dies kann zu einer komplexen for-Schleife vereinfacht werden : for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }.
Tim Cooke
1

2 Möglichkeiten, ein Array umzukehren.

  1. Verwenden Sie die For-Schleife und tauschen Sie die Elemente bis zum Mittelpunkt mit der Zeitkomplexität von O (n / 2) aus.

    private static void reverseArray() {
    int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
    
    for (int i = 0; i < array.length / 2; i++) {
        int temp = array[i];
        int index = array.length - i - 1;
        array[i] = array[index];
        array[index] = temp;
    }
    System.out.println(Arrays.toString(array));

    }}

  2. Verwenden der integrierten Funktion (Collections.reverse ())

    private static void reverseArrayUsingBuiltInFun() {
    int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
    
    Collections.reverse(Ints.asList(array));
    System.out.println(Arrays.toString(array));

    }}

    Ausgabe: [6, 5, 4, 3, 2, 1]

Sameer Shrestha
quelle
3
Was ist Ints?
CodingNow
@CodingNow ist es eine der Guava Utility Helper Klassen - siehe hier
mrec
0

Unten finden Sie das vollständige Programm, das auf Ihrem Computer ausgeführt werden soll.

public class ReverseArray {
    public static void main(String[] args) {
        int arr[] = new int[] { 10,20,30,50,70 };
        System.out.println("reversing an array:");
        for(int i = 0; i < arr.length / 2; i++){
            int temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }   
    }
}

Für Programme auf Matrix, die Arrays verwenden, ist dies die gute Quelle. Gehen Sie über den Link.

Mdhar9e
quelle
0

Wenn Sie die XOR-Lösung verwenden, um die temporäre Variable zu vermeiden, sollte Ihr Code aussehen

for(int i = 0; i < validData.length; i++){
    validData[i] = validData[i] ^ validData[validData.length - i - 1];
    validData[validData.length - i - 1] = validData[i] ^ validData[validData.length - i - 1];
    validData[i] = validData[i] ^ validData[validData.length - i - 1];
}

Siehe diesen Link für eine bessere Erklärung:

http://betterexplained.com/articles/swap-two-variables-using-xor/

Vikarjramun
quelle
0
private static int[] reverse(int[] array){
    int[] reversedArray = new int[array.length];
    for(int i = 0; i < array.length; i++){
        reversedArray[i] = array[array.length - i - 1];
    }
    return reversedArray;
} 
Stuart Clark
quelle
4
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu. Nur-Code-Antworten erklären nichts.
Rgettman
0

Hier ist eine einfache Implementierung zum Umkehren eines Arrays eines beliebigen Typs sowie vollständige / teilweise Unterstützung.

import java.util.logging.Logger;

public final class ArrayReverser {
 private static final Logger LOGGER = Logger.getLogger(ArrayReverser.class.getName());

 private ArrayReverser () {

 }

 public static <T> void reverse(T[] seed) {
    reverse(seed, 0, seed.length);
 }

 public static <T> void reverse(T[] seed, int startIndexInclusive, int endIndexExclusive) {
    if (seed == null || seed.length == 0) {
        LOGGER.warning("Nothing to rotate");
    }
    int start = startIndexInclusive < 0 ? 0 : startIndexInclusive;
    int end = Math.min(seed.length, endIndexExclusive) - 1;
    while (start < end) {
        swap(seed, start, end);
        start++;
        end--;
    }
}

 private static <T> void swap(T[] seed, int start, int end) {
    T temp =  seed[start];
    seed[start] = seed[end];
    seed[end] = temp;
 }  

}

Hier ist der entsprechende Unit Test

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Before;
import org.junit.Test;

public class ArrayReverserTest {
private Integer[] seed;

@Before
public void doBeforeEachTestCase() {
    this.seed = new Integer[]{1,2,3,4,5,6,7,8};
}

@Test
public void wholeArrayReverse() {
    ArrayReverser.<Integer>reverse(seed);
    assertThat(seed[0], is(8));
}

 @Test
 public void partialArrayReverse() {
    ArrayReverser.<Integer>reverse(seed, 1, 5);
    assertThat(seed[1], is(5));
 }
}
craftsmannadeem
quelle
0

Folgendes habe ich mir ausgedacht:

// solution 1 - boiler plated 
Integer[] original = {100, 200, 300, 400};
Integer[] reverse = new Integer[original.length];

int lastIdx = original.length -1;
int startIdx = 0;

for (int endIdx = lastIdx; endIdx >= 0; endIdx--, startIdx++)
   reverse[startIdx] = original[endIdx];

System.out.printf("reverse form: %s", Arrays.toString(reverse));

// solution 2 - abstracted 
// convert to list then use Collections static reverse()
List<Integer> l = Arrays.asList(original);
Collections.reverse(l);
System.out.printf("reverse form: %s", l);
Einfache Lösung
quelle
0

Es gibt zwei Möglichkeiten, eine Lösung für das Problem zu finden:

1. Kehren Sie ein Array im Raum um.

Schritt 1. Tauschen Sie die Elemente am Anfangs- und am Endindex aus.

Schritt 2. Inkrementieren Sie den Startindex. Verringern Sie den Endindex.

Schritt 3. Wiederholen Sie Schritt 1 und Schritt 2 bis zum Startindex <Endindex

Hierzu beträgt die zeitliche Komplexität O (n) und die räumliche Komplexität O (1).

Der Beispielcode zum Umkehren eines Arrays im Raum lautet wie folgt:

public static int[] reverseAnArrayInSpace(int[] array) {
    int startIndex = 0;
    int endIndex = array.length - 1;
    while(startIndex < endIndex) {
        int temp = array[endIndex];
        array[endIndex] = array[startIndex];
        array[startIndex] = temp;
        startIndex++;
        endIndex--;
    }
    return array;
}

2. Kehren Sie ein Array mit einem Hilfsarray um.

Schritt 1. Erstellen Sie ein neues Array mit einer Größe, die dem angegebenen Array entspricht.

Schritt 2. Fügen Sie Elemente ab dem Startindex und ab dem Endindex in das neue Array ein.

Hierzu beträgt die zeitliche Komplexität O (n) und die räumliche Komplexität O (n).

Der Beispielcode zum Umkehren eines Arrays mit einem Hilfsarray lautet wie folgt:

public static int[] reverseAnArrayWithAuxiliaryArray(int[] array) {
    int[] reversedArray = new int[array.length];
    for(int index = 0; index < array.length; index++) {
        reversedArray[index] = array[array.length - index -1]; 
    }
    return reversedArray;
}

Dazu können wir auch die Collections-API von Java verwenden.

Die Collections-API verwendet intern denselben Reverse-in-Space-Ansatz.

Der Beispielcode für die Verwendung der Collections-API lautet wie folgt:

public static Integer[] reverseAnArrayWithCollections(Integer[] array) {
    List<Integer> arrayList = Arrays.asList(array);
    Collections.reverse(arrayList);
    return arrayList.toArray(array);
}
Karan Khanna
quelle
0
static int[] reverseArray(int[] a) {
     int ret[] = new int[a.length];
     for(int i=0, j=a.length-1; i<a.length && j>=0; i++, j--)
         ret[i] = a[j];
     return ret;
}
ZA Abbasi
quelle
0
 public static int[] reverse(int[] array) {

    int j = array.length-1;
    // swap the values at the left and right indices //////
        for(int i=0; i<=j; i++)
        {
             int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
           j--;
        }

         return array;
    }

      public static void main(String []args){
        int[] data = {1,2,3,4,5,6,7,8,9};
        reverse(data);

    }
Roshan Posakya
quelle
0
    public static void main(String args[])    {
        int [] arr = {10, 20, 30, 40, 50}; 
        reverse(arr, arr.length);
    }

    private static void reverse(int[] arr,    int length)    {

        for(int i=length;i>0;i--)    { 
            System.out.println(arr[i-1]); 
        }
    }
Kalidindi Prashanth
quelle
0

Es gibt einige großartige Antworten oben, aber so habe ich es gemacht:

public static int[] test(int[] arr) {

    int[] output = arr.clone();
    for (int i = arr.length - 1; i > -1; i--) {
        output[i] = arr[arr.length - i - 1];
    }
    return output;
}
Ahmad Dalao
quelle