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

     } 


}