2017-08-27 15 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]+" "); 
    } 
} 

}順に配列を並べ替え - 最小、最大、2番目の最小、

が予想し、2番目に大きな出力:1 9 2 8 3 7 4 6 5

マイ出力:1 9 2 8 3 7 4 6 5 5

ソートされた配列の中間要素を奇数長さの2倍にする。偶数長の出力が正しい。印刷部で

アドバンス

答えて

3

並べ替え一部が右に感謝しています混乱、それをアップ。同じインデックスになるか2つの要素を右のものより大きくするまで、2つの要素を印刷してください。

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

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

です。

reverseArrayは以下の通りである。
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 
} 

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

ここで何が起こっているのかを理解する必要があります。あなたが言うように、途中で偶数の長さの出力が正しいです。しかし、2倍の奇妙な長さです。あなたの声明をチェックしましょう。

arr[i]arr[j]を印刷するときに、毎回プリントステートメントに記されています。配列番号として作用する。

長さが偶数の場合、あなたの状態がループだからループを実行しているi <= n まで移動することになると言うので、 あなたは// 4

n = array.length/2;を持っています。 これは起こっていることです。

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置くが、この意志だということを修正するには間違っている//長さが奇妙なときに現在得ている出力を変更してください(中間要素の2倍は得られません)。実際には、中間のインデックス要素はすべて印刷されません。

だから、あなたのロジック、 を保ち、私はこの

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

     } 


} 
を示唆しています
関連する問題