Làm cách nào để đảo ngược một mảng int trong Java?


238

Tôi đang cố gắng đảo ngược một mảng int trong Java.

Phương pháp này không đảo ngược mảng.

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

Điều gì là sai với nó?


31
Tôi thấy những gì tôi đã làm sai. Nên hợp lệData.length / 2. Nếu không nó sẽ tự đảo ngược sau đó tự đảo ngược.
MichaelScott

4
Xem en.wikipedia.org/wiki/In-place_alacticm có chứa mô tả về phiên bản chính xác của thuật toán này.
Dean Povey

Câu trả lời:


283

Để đảo ngược một mảng int, bạn trao đổi các mục lên cho đến khi bạn đạt đến điểm giữa, như thế này:

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

Cách bạn đang thực hiện, bạn trao đổi từng phần tử hai lần, do đó, kết quả giống như danh sách ban đầu.


Và tôi muốn đặt validData.length / 2một phần ra bên ngoài vòng lặp for.
Jin Kwon

7
@ Tôi sẽ không. Nó chỉ làm xáo trộn ý nghĩa và tôi cá rằng trình biên dịch tối ưu hóa sẽ làm điều đó cho bạn bằng mọi cách. Bất kể, không có điểm tối ưu hóa vi mô cho đến khi bạn có bằng chứng rõ ràng từ hồ sơ rằng nó là cần thiết / hữu ích.
Nicu Stiurca

9
@JinKwon Điều đó sẽ giống như làm validData.length >> 1. Điều đó là tương đương và nhanh hơn, nhưng nó gây nhầm lẫn cho nhiều lập trình viên và bất kỳ trình biên dịch tốt nào cũng sẽ tự động làm điều đó.
Justin

2
Bạn chỉ nên thực hiện phép tính này một lần validData.length - i - 1và lưu nó vào một biến.

Bất cứ ai có thể đề nghị một sự đảo ngược với biến temp ra !!
sg28

303

Với Commons.Lang , bạn chỉ cần sử dụng

ArrayUtils.reverse(int[] array)

Hầu hết thời gian, sẽ nhanh hơn và an toàn hơn khi sử dụng các thư viện có sẵn dễ dàng đã được kiểm tra đơn vị và kiểm tra người dùng khi họ xử lý vấn đề của bạn.


3
Tôi đã thích nó đã trả về mảng đảo ngược (thông qua) cho phong cách giống như chức năng.
Laurent G

2
@ laurent-g để công bằng: để đảo ngược mảng theo cách này hiệu quả hơn về bộ nhớ, đó có thể là lý do tại sao họ đã làm theo cách này.
Tự xác nhận

4
Quan điểm của tôi không phải là bản sao hay không sao chép. Thông điệp của tôi nói "(đã thông qua)" được trả lại (sau khi được đảo ngược), vì vậy nó có thể được chuyển trong một biểu thức, không cần một tuyên bố riêng.
Laurent G

52
public class ArrayHandle {
    public static Object[] reverse(Object[] arr) {
        List<Object> list = Arrays.asList(arr);
        Collections.reverse(list);
        return list.toArray();
    }
}

11
Tất nhiên rồi. Một danh sách chỉ có thể chứa các Đối tượng, không phải là nguyên thủy, vì vậy tất cả các nguyên hàm ( inttrong trường hợp này) được gói vào các hàm bao tương ứng của chúng ( Integers trong trường hợp này) và đưa vào danh sách. Bạn thấy, Integers là đối tượng. @Tom
11684

6
Xem ra: Nếu tôi không sai, mảng ban đầu được sửa đổi. Để làm cho nó rõ ràng bạn có thể muốn chỉ không trả lại bất cứ điều gì.
Andrea Zilio

3
@ 11684 Có, danh sách chung chỉ có thể chứa Đối tượng. Nhưng phương thức chấp nhận một mảng. Mảng có thể giữ nguyên thủy. Do đó int[]khác với Integer[]. Hãy thử nó : Integer[] array = new int[5]. Bạn sẽ nhận được một lỗi biên dịch. Đây là lý do tại sao Arrayslớp Java định nghĩa một loạt các phương thức để làm việc với các mảng nguyên thủy. Cố gắng vượt qua một int[]phương pháp trên sẽ dẫn đến kết quả như thế nào The method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[]). @Filip - một thuật toán tại chỗ sử dụng ít bộ nhớ hơn và chạy nhanh hơn.
Brian McCutchon

3
@Andrea Thật ra thì không. Danh sách được trả về bởi Arrays.asList()không tham chiếu mảng ban đầu, cũng không trả về mảng. Đó là một trong những vấn đề với phương pháp này: nó sử dụng gấp ba bộ nhớ và thực hiện gấp ba công việc như một thuật toán tại chỗ.
Brian McCutchon

4
Bản thân phương thức này có thể hoạt động, nhưng đơn giản là người ta không thể chuyển một int[]đối số cho phương thức này ( "các loại không tương thích: int [] không thể được chuyển đổi thành Object []" ).
MC Hoàng đế

47
Collections.reverse(Arrays.asList(yourArray));

java.util.Collections.reverse()có thể đảo ngược java.util.Lists và java.util.Arrays.asList()trả về một danh sách bao bọc mảng cụ thể mà bạn truyền cho nó, do đó yourArraybị đảo ngược sau khi gọi Collections.reverse().

Chi phí chỉ là việc tạo ra một đối tượng List và không cần thêm thư viện.

Một giải pháp tương tự đã được trình bày trong câu trả lời của Tarik và các nhà bình luận của họ, nhưng tôi nghĩ câu trả lời này sẽ ngắn gọn hơn và dễ phân tích hơn.


14
Đối với mảng của các đối tượng, đây là một giải pháp tốt. Nhưng nó không hoạt động cho các mảng nguyên thủy. Ví dụ. đi qua một int[]tới asList(...)sẽ không trở lại một List<Integer>, nhưng là một List<int[]>, chứa một phần tử. Có AFAICS không có cách tích hợp đơn giản nào để chuyển đổi int[]thành một Integer[].
Martin Rust

4
Điều này sẽ không hoạt động với các mảng nguyên thủy ... các bộ sưu tập không trả về giá trị vì vậy bây giờ bạn có một mảng vô dụng như một danh sách trong bộ nhớ
NightSkyCode

@MartinRust Java 8+: Arrays.stream(arr).boxed().collect(Collectors.toList())hoặcArrays.stream(arr).boxed().toArray(Integer[]::new)
Simon Forsberg

39

Tôi nghĩ rằng việc theo logic của thuật toán sẽ dễ dàng hơn một chút nếu bạn khai báo các biến rõ ràng để theo dõi các chỉ số mà bạn đang hoán đổi ở mỗi lần lặp của vòng lặp.

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

Tôi cũng nghĩ rằng nó dễ đọc hơn để làm điều này trong một vòng lặp.

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

hoán đổi trường học cũ có vẻ dễ dàng hơn nhưng có khi liên quan đến các giá trị chỉ số mảng trái, phải, ... sẽ hữu ích cho việc gỡ lỗi nếu có
Srinath Ganesh

Bạn cũng có thể thêm 'trao đổi khoảng trống tĩnh công khai (int [] data, int index1, int index2) {...}' và sử dụng từ 'đảo ngược' như thế này: hoán đổi (dữ liệu, trái, phải).
chiều_

13

Đã có rất nhiều câu trả lời ở đây, chủ yếu tập trung vào việc sửa đổi mảng tại chỗ. Nhưng để hoàn thiện, đây là một cách tiếp cận khác sử dụng các luồng Java để bảo toàn mảng ban đầu và tạo một mảng đảo ngược mới:

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

10

Với ổi:

Collections.reverse(Ints.asList(array));

4
Thật là tuyệt vời! Ngắn gọn và hiệu quả. Giống như tất cả các asListphương thức, nó tạo ra một khung nhìn ghi trực tiếp vào mảng sao lưu (nguyên thủy). Tôi nghĩ rằng những người bỏ phiếu ở đây đã lầm tưởng rằng điều này trả về một danh sách đóng hộp hoặc một cái gì đó.
Luke Usherwood

@LukeUsherwood có lẽ vẫn sẽ có một số chi phí từ quyền anh và bỏ hộp khi gọi get và thiết lập trên mỗi yếu tố. Nhưng tôi đồng ý với bạn rằng đây là một giải pháp tuyệt vời.
Patrick Parker

Thật vậy, đó là giá trị nhận thức được. Tôi không nghĩ rằng nó sẽ là một vấn đề lớn trong phần lớn mã mà cá nhân tôi làm việc với - các khu vực 'nóng' của chúng tôi được xác định rõ, phần còn lại là 'mã keo'. Đồng thời tôi cũng đồng tình rằng việc khuấy bộ nhớ cũng tạo ra một chi phí "ẩn" bổ sung mà các trình định dạng không gán cho hàm thực tế.
Luke Usherwood

@LukeUsherwood nó vẫn trả về một danh sách được đóng hộp thay vì một mảng gốc
AnthonyJClink

2
@AnthonyJClink Không chắc chắn "nó" đề cập đến điều gì, nhưng tiện ích JDK Collections.reverselà một phương thức void. Điều này hoạt động tại chỗ trên một lớp bên trong Guava bao bọc một int[](Vì nó không bao giờ lưu danh sách các hộp được đóng hộp Integernên tôi sẽ không gọi lớp đó là "danh sách đóng hộp", mà là "Danh sách dạng xem của một mảng"). Nhưng vâng, nó hoạt động thông qua một giao diện đi qua Integercác đối tượng, vì vậy điều này sẽ tạo ra rất nhiều vật thể tạm thời và quyền anh như đã đề cập. Hãy thử một IntStreamhoặc một thư viện bộ sưu tập nguyên thủy cho vấn đề hiệu suất. (Trove, Koloboke, Bộ sưu tập Eclipse, ...)
Luke Usherwood

9

Trong trường hợp của Java 8, chúng ta cũng có thể sử dụng IntStreamđể đảo ngược mảng số nguyên như:

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]

7

Đơn giản cho vòng lặp!

for (int start = 0, end = array.length - 1; start <= end; start++, end--) {
    int aux = array[start];
    array[start]=array[end];
    array[end]=aux;
}

4
Trong tương lai, xin vui lòng cho người hỏi biết cụ thể những gì họ đã làm không chính xác và những gì bạn đã làm đúng.
Kartik Chugh

1
đổi start <= endthànhstart < end
Leonard Pauli

5

Điều này sẽ giúp bạn

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

5
for(int i=validData.length-1; i>=0; i--){
  System.out.println(validData[i]);
 }

Thật không may, đây là câu trả lời rõ ràng nhất có sẵn ở đây, bởi vì mọi nhà phát triển sẽ biết cách thực hiện và nó không yêu cầu bất kỳ cài đặt gói mở rộng nào.
Hold OfferHunger

4

Đây là cách cá nhân tôi sẽ giải quyết nó. Lý do đằng sau việc tạo phương thức tham số hóa là để cho phép bất kỳ mảng nào được sắp xếp ... không chỉ các số nguyên của bạn.

Tôi hy vọng bạn lượm lặt một cái gì đó từ nó.

@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;
}

2
Không giải quyết vấn đề ban đầu bằng cách sử dụng nguyên thủy.
Melinda Green

Có nhiều cách để chuyển đổi prims thành đối tượng. Tôi luôn khuyên bạn nên tránh prims bất cứ nơi nào có thể trong java và tôi cũng tin rằng nó nên được khuyến khích.
AnthonyJClink

Chuyển đổi một mảng nguyên thủy có độ dài không xác định thành một mảng có thể là một ý tưởng rất tồi, đặc biệt là nếu được thực hiện mà không nhận ra nó. Java không phải là Smalltalk. Người nguyên thủy là một phần của ngôn ngữ và có vị trí của họ. Không thành vấn đề nếu chúng ta không thích chúng, chúng ta phải chấp nhận chúng và sử dụng chúng khi thích hợp.
Melinda Green

1
Bạn thực sự không cần phải sao chép mảng Collections.reverse(asList(arraytoReverse)); return arrayToReverse;. asListchỉ là một trình bao bọc xung quanh mảng, vì vậy mảng ban đầu bị đảo ngược.
Radiodef

3

Chương trình của bạn sẽ chỉ làm việc length = 0, 1. Bạn co thể thử :

int i = 0, j = validData.length-1 ; 
while(i < j)
{
     swap(validData, i++, j--);  // code for swap not shown, but easy enough
}

3
Có lẽ bạn có nghĩa là trao đổi dưới dạng mã giả cho một trao đổi nội tuyến chứ không phải là một cuộc gọi phương thức, nhưng nếu không thì nó sẽ không hoạt động. Java chuyển qua tham chiếu để không thể viết phương thức hoán đổi cho các biến.
Dean Povey

Ý tôi là bất cứ cách nào bạn có thể khiến v [i] & v [j] trao đổi. Tôi biết làm thế nào các cuộc gọi phương thức làm việc trong java. Đối với phương thức, bạn có thể làm một cái gì đó như hoán đổi (v, i ++, j--);
fastcodejava

1
Dean, mảng validData là một đối tượng, được truyền bằng tham chiếu, vì vậy phương thức exchange () sẽ hoạt động hoàn hảo.
Gaël Oberson

3

Nếu làm việc với dữ liệu nguyên thủy hơn (ví dụ char, byte, int, v.v.) thì bạn có thể thực hiện một số thao tác XOR thú vị.

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];
    }
}

1
Quá dễ thương để thực sự sử dụng trong mã sản xuất nhưng dù sao cũng vui. Để dễ thương tối đa, hãy sử dụng% = thao tác như thế này: mảng [i]% = mảng [len - i - 1], v.v.
Melinda Green

Tương tự, nhưng ngắn hơn một chút: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

Nó là hiệu quả nhất để đơn giản lặp lại các mảng ngược.

Tôi không chắc liệu giải pháp của Aaron có thực hiện cuộc gọi này Collections.reverse(list);không? Có ai biết không?


Lặp lại ngược trên mảng đòi hỏi một mảng mới. Tôi thích giải pháp được đăng ở trên, đó là đảo ngược nội tuyến mà không tạo ra một mảng mới.
mmcdole

1
@Simucal tại sao tạo một mảng mới? Chỉ cần lặp lại nó ngược.
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;
        }
    }

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]);
  }
}

1
vâng tôi đã thử mã giống và rõ ràng cùng với đầu ra là int [] a = {1,3,5,2,6,7}; for (int i = a.length-1; i> = 0; i--) {System.out.print (a [i] + "");} `nó sẽ đảo ngược mảng từ chỉ mục cuối cùng sang chỉ mục đầu tiên
Rocket_03

1

Sẽ không làm theo cách này sẽ khó xảy ra hơn nhiều cho những sai lầm?

    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;

1

Giải pháp với độ phức tạp thời gian o (n) và độ phức tạp không gian o (1).

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

Chỉ cần FYI, điều này có thể được đơn giản hóa thành một vòng lặp phức tạp : for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }.
Tim Cooke

1

2 cách để đảo ngược một mảng.

  1. Sử dụng vòng lặp For và hoán đổi các phần tử cho đến điểm giữa với độ phức tạp thời gian của O (n / 2).

    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. Sử dụng hàm dựng sẵn (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));

    }

    Đầu ra: [6, 5, 4, 3, 2, 1]


3
Ints
Mã hóa

@CodingNow đây là một trong những lớp trợ giúp tiện ích của Guava - xem tại đây
mrec

0

Dưới đây là chương trình hoàn chỉnh để chạy trong máy của bạn.

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]);
        }   
    }
}

Đối với các chương trình trên ma trận sử dụng mảng, đây sẽ là nguồn tốt . Đi qua liên kết.


0

Sử dụng giải pháp XOR để tránh biến tạm thời, mã của bạn sẽ giống như

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];
}

Xem liên kết này để được giải thích tốt hơn:

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


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

4
Vui lòng xem xét thêm một lời giải thích cho câu trả lời của bạn. Câu trả lời chỉ có mã không giải thích bất cứ điều gì.
rgettman

0

Đây là một cách thực hiện đơn giản, để đảo ngược mảng của bất kỳ loại nào , cộng với hỗ trợ đầy đủ / một phần .

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

}

Dưới đây là bài kiểm tra đơn vị tương ứng

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));
 }
}

0

Đây là những gì tôi nghĩ ra:

// 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);

0

Có hai cách để có giải pháp cho vấn đề:

1. Đảo ngược một mảng trong không gian.

Bước 1. Hoán đổi các yếu tố ở đầu và chỉ mục kết thúc.

Bước 2. Tăng chỉ số bắt đầu giảm chỉ số kết thúc.

Bước 3. Lặp lại Bước 1 và Bước 2 cho đến khi bắt đầu chỉ mục <chỉ mục kết thúc

Đối với điều này, độ phức tạp thời gian sẽ là O (n) và độ phức tạp không gian sẽ là O (1)

Mã mẫu để đảo ngược một mảng trong không gian giống như:

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. Đảo ngược một mảng bằng cách sử dụng một mảng phụ trợ.

Bước 1. Tạo một mảng mới có kích thước bằng với mảng đã cho.

Bước 2. Chèn các phần tử vào mảng mới bắt đầu từ chỉ mục bắt đầu, từ mảng đã cho bắt đầu từ chỉ mục kết thúc.

Đối với điều này, độ phức tạp thời gian sẽ là O (n) và độ phức tạp không gian sẽ là O (n)

Mã mẫu để đảo ngược một mảng với mảng phụ trợ giống như:

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

Ngoài ra, chúng ta có thể sử dụng API Bộ sưu tập từ Java để thực hiện việc này.

API Bộ sưu tập trong nội bộ sử dụng cùng một cách tiếp cận ngược lại trong cách tiếp cận không gian.

Mã mẫu để sử dụng API Bộ sưu tập giống như:

public static Integer[] reverseAnArrayWithCollections(Integer[] array) {
    List<Integer> arrayList = Arrays.asList(array);
    Collections.reverse(arrayList);
    return arrayList.toArray(array);
}

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

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

    }

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]); 
        }
    }

0

Có một số câu trả lời tuyệt vời ở trên, nhưng đây là cách tôi đã làm:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.