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
将奇数长度的排序数组的中间元素两次。对于偶数长度输出是正确的。
先谢谢
答案 0 :(得分: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]);
我在循环外部比较了i
和j
而不是内部,以保存整个比较的数量。 (一般情况下)
对于中间人,只需打印一次,检查循环外的索引。
你怎么能自己解决它?
通过干运行代码并理解它为什么这样做?为什么偏离正确答案?
学习使用调试器逐步完成代码。当你开始写作甚至阅读更大的代码时,它可能会有所帮助。
答案 1 :(得分: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]);
}
}
答案 2 :(得分: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
方法来解决每次迭代翻转数组的问题。
答案 3 :(得分: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]
。其中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]+" ");
}
}
}