2017-08-27 128 views
1
public class RearrageArrayOrder { 

public static void main(String[] args) 
{ 
    int arr[]= { 5, 8, 1, 4, 2, 9, 3, 7, 6 }; 
    Arrays.sort(arr); 
    int n=arr.length; 
    for(int i=0,j=n-1;i<=n/2 ;i++,j--) 
    { 
     System.out.print(arr[i]+" "+arr[j]+" "); 
    } 
} 

}重新排列的陣列 - 最小,最大,第二最小,第二最大,

期待輸出:1 9 2 8 3 7 4 6 5

我的輸出:1 9 2 8 3 7 4 6 5 5

對於奇數長度獲得排序數組的中間元素兩次。對於偶數長度輸出是正確的。

在此先感謝

回答

3

排序部分是正確的,但你在打印部分搞砸了。只要打印兩個元素,直到找到相同的索引或者留下比右側大的一個。

for(i=0,j=n-1;i<j;i++,j--) // i and j are declared outside loop. 
{ 
System.out.print(arr[i]+" "+arr[j]+" "); 
} 
if(i==j) 
    print(arr[i]); 

我比較ij的循環,而不是內部外部,保存比較整體的數量。 (在一般情況下)

對於中間的只檢查循環外的索引來打印。

你怎麼可以自己解決它?

  1. 幹運行的代碼,並理解它爲什麼這樣做?爲什麼偏離正確答案?

  2. 學會使用調試器來遍歷代碼。這可能會在以後寫作或讀取更大的代碼時提供幫助。

1

這是你的問題

int arr[]= { 5, 8, 1, 4, 2, 9, 3, 7, 6 }; 
    Arrays.sort(arr); 
    int n=arr.length; 
    for(int i=0, j=n-1; i<=j; i++, j--){ 
     if(i !=j) 
     System.out.print(arr[i]+" "+arr[j]+" "); 
     else{ 
      System.out.print(arr[i]); 
     } 

    } 
1

雖然好現有的答案也解決一下這裏需要非常簡單的解決方案。然而,以不同的方式做同樣的可能是:

public static void main(String[] args) { 
    int arr[] = {5, 8, 1, 4, 2, 9, 3, 7, 6, 10}; 
    Arrays.sort(arr); 
    while (arr.length != 0) { // unless there is any element in arr 
     System.out.print(arr[0] + " "); // print the first element 
     arr = Arrays.copyOfRange(arr, 1, arr.length); // clone the remaining elements 
     arr = reverseArray(arr); // reverse the array 
    } // repeat 
} 

其中reverseArray如下:

private static int[] reverseArray(int[] arr) { 
    int n = arr.length - 1; 
    int[] temp = new int[n + 1]; 
    int i = 0; 
    while (i <= n) { 
     temp[i] = arr[n - i]; 
     i++; 
    } 
    return temp; 
} 

和本來的reverseArray方法被添加到解決翻轉陣列每次迭代。

0
int n = array.length; 
    for(int i=0,j=n-1;i<=n/2 ;i++,j--) 
    { 
     System.out.print(arr[i]+" "+arr[j]+" "); 
    } 

您需要了解這裏發生了什麼。正如你所說的那樣,中等長度輸出是正確的。但對於奇數長度的兩倍。讓我們來檢查你的陳述。

您正在打印arr[i]arr[j]每次都在您的打印聲明中。其中ij充當陣列的index

說,當長度是偶數。 你有

n = array.length/2; // 4 因爲你的病情說循環將移動至i <= n 所以運行循環。 這就是發生了什麼事。

i ------ j

0 ---- 7  // arrayelements 1 8 

1 ---- 6  // arrayelements 2 7 

2 ---- 5 // arrayelements 3 6 

3 ---- 4 // arrayelements 4 5 

4 ---- 3 // arrayelements 5 4 

5 // i > n ; out of the loop! 

輸出1 8 2 7 3 6 4 5 5 4 //即使連長度你的輸出是錯誤的

爲了解決這個問題,最好你把i = n/2 - 1但這種意志當長度奇怪時,改變你當前得到的輸出(你不會得到中間元素的兩倍)。實際上,你根本不會打印中間索引元素。

所以,保持你的邏輯, 我建議這個

for(int i=0,j=n-1;i<=n/2 ;i++,j--) 
{ 
    if(n%2 == 0) // if length is even 
    { 
     if(i==n/2) 
     { 
      break;  //not printing twice the elements as you can see above instead breaking out of the loop 
     } 
     else{ 
       System.out.print(arr[i]+" "+arr[j]+" "); 
     } 
     } 
     else  //if length is odd 
     { 
      if (i == n/2) 
      { 
       System.out.print(arr[i]);  // when i has reached n/2 print value of i (one time of middle element, like 5 in your case) and break 
       break; 
      } 
      else{ 
       System.out.print(arr[i]+" "+arr[j]+" "); 
      } 

     } 


}