按顺序重新排列数组 – 最小、最大、第二小、第二大


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

获取排序数组的中间元素两次以获得奇数长度。对于偶数长度输出是正确的。

提前致谢

排序部分是正确的,但你在打印部分搞砸了。只需打印两个元素,直到您到达相同的索引或留下一个大于右侧的索引。

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. 了解如何使用调试器单步执行代码。当您以后开始编写甚至阅读更大的代码时,这可能会有所帮助。

这是解决您问题的非常简单的解决方案

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

好吧,尽管现有的答案确实解决了这里所需的问题。然而,另一种方式可能是:

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方法来解决每次迭代翻转数组的问题。

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

比如说,当长度均匀时。 你有

1 2 3 4 5 6 7 8

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

}

最新更新