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]);
我在循环外部而不是内部比较了i
和j
,以节省整体比较次数。(一般情况下(
对于中间的,只需打印一次检查循环外的索引。
你怎么能自己解决呢?
通过干运行代码并理解它为什么要这样做?为什么它偏离了正确答案?
了解如何使用调试器单步执行代码。当您以后开始编写甚至阅读更大的代码时,这可能会有所帮助。
这是解决您问题的非常简单的解决方案
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]
。其中i
和j
充当数组的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]+" ");
}
}
}