2012-04-03 28 views
19

Tôi đang cố gắng đảo ngược thứ tự của một Mảng trong java.
Cách hiệu quả nhất để làm điều đó trong O (n) với số lượng bộ nhớ ít nhất được sử dụng.
Không cần trả lời bằng mã, mã giả sẽ không sao.
Đây là quá trình suy nghĩ của tôi:Thứ tự Đảo ngược

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

Có cách nào tốt hơn hiệu quả hơn để làm điều này có lẽ không cần sử dụng một mảng temp? và Cuối cùng, giả định rằng không có null trong mảng, vì vậy mọi thứ đều có thể hoạt động. Cảm ơn bạn

Chỉnh sửa: không phải đây không phải là bài tập về nhà.

+2

Đây có phải là bài tập về nhà không? Nếu có, vui lòng gắn thẻ như vậy. –

+2

xem xét việc hoán đổi mục đầu tiên và cuối cùng và sau đó là mục cuối cùng thứ hai và thứ hai cho đến khi bạn đạt được một nửa danh sách ...bạn sẽ chỉ cần một biến tạm thời và vẫn sẽ đi qua danh sách một lần? –

+2

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

Trả lời

53

tôi f là một mảng đối tượng, sau đó Collections.reverse(Arrays.asList(array)) sẽ thực hiện công việc với bộ nhớ không đổi và thời gian tuyến tính - không yêu cầu mảng tạm thời.

+4

+1 Thật vậy, kể từ khi OP bây giờ nói đây không phải là bài tập về nhà, đây là một câu trả lời tuyệt vời. –

+0

Yêu giải pháp. Chỉ cần xác nhận rằng không có mảng tạm thời được yêu cầu xem: http://ideone.com/api/embed.js/link/xLLTpl ... nhấp vào "Sao chép" và sau đó "Chạy" – eddyparkinson

+0

Không hoạt động, ít nhất với Java 1.6: System.out.println (X [0] + "đến" + X [X.length - 1]); \t \t \t Collections.reverse (Arrays.asList (X)); \t \t \t System.out.println (X [0] + "đến" + X [X.length - 1]); in: 2272.6270739116 đến 186.704625250768 2272.6270739116 đến 186.704625250768 –

10

Sử dụng một yếu tố tạm thời.

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

bạn có thể làm điều đó mà không cần một mảng tạm

  • vòng lặp từ đầu (hoặc cuối không quan trọng) đến giữa mảng
  • yếu tố trao đổi với phần tử ở (cuối cùng yếu tố - index) (để 0 và size - 1, 1 và size - 2 vv)
  • bạn sẽ làm điều gì đó như thế này để trao đổi:
 
    temp = a[i]; 
    a[i] = a[end-i]; 
    a[end-i] = temp; 
  • lặp lại
12

Bạn không cần phải sử dụng một mảng tạm thời; chỉ cần bước qua mảng từ đầu đến nửa, trao đổi phần tử tại i cho phần tử tại array.length-i-1. Hãy chắc chắn xử lý các yếu tố trung một cách chính xác (không khó để làm, nhưng làm chắc chắn.)

0

giả, giả sử mảng 0-dựa-index:

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

Điều này không giống như Java. – ceving

+2

do đó 'pseudocode' – mcfinnigan

1

Dưới đây là hai giải pháp:

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

Một giải pháp khác được (tùy thuộc vào hoàn cảnh của bạn) giả đảo ngược mảng bằng cách lập chỉ mục:

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

Cho phép xem xét các mảng là mảng Integer thì chúng ta cũng có thể tìm kiếm một giải pháp như thế này

arr - mảng 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

Bạn có thể làm việc này mà chỉ hai bước

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

Sử dụng cùng một phương pháp như câu trả lời được chấp nhận, ít thanh lịch hơn và ít giải thích hơn. –

+0

không cần phải giải thích bro nó ít hai bước thứ hai tôi không giải thích. – Darshan

+0

Câu trả lời hay về Stack Overflow giải thích mọi thứ. Câu trả lời được chấp nhận. Nếu đã có một câu trả lời tốt cho biết điều tương tự bạn muốn, hoặc nếu không có cách nào để viết một câu trả lời hay, thì không có điểm nào trong việc thêm câu trả lời cho câu hỏi: chỉ thêm tiếng ồn. –