给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。
注意事项
不需要保持正整数或者负整数原来的顺序。
样例
注意事项
不需要保持正整数或者负整数原来的顺序。
样例
给出数组[-1, -2, -3, 4, 5, 6],重新排序之后,变成[-1, 5, -2, 4, -3, 6]或者其他任何满足要求的答案
思路,首先将数组中的所有正数(负数)移到左半边,负数(正数)移到右半边,我的代码中是后一种,也就是说所有的正数在前,负数在后,然后判断,当数组长度是偶数的时候,直接让left=1,right=数组长度-2,然后开始交换,交换玩一次,left+2,right-2,继续交换,直至left>=right结束;而当数组长度是偶数时,需要判断中间的数也就是A[n/2]的正负,这里暂时用n表示数组长度,当A[n/2]是正数的时候,说明正数比负数多至少一个,其实这里考虑多一个的情况就可以了,因为想要真正的正负交替,只有正负数的个数一样多,或者正数比负数多一个,负数比正数多一个。如果多出的数量大于一的话,就没法说是真正意义上的正负数交错的数组了,必然有两个同号的相连。所以在这里,当正数比负数多一个的时候,就把正数和第一个数(负数)交换,然后从第二个位置到最后一个位置,再按照长度是偶数的做法交换即可,负数比正数多一个也一样,把负数与最后一个数(正数)交换,然后再做。
import java.util.Scanner;
/**
*
* 给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。
注意事项
不需要保持正整数或者负整数原来的顺序。
样例
给出数组[-1, -2, -3, 4, 5, 6],重新排序之后,变成[-1, 5, -2, 4, -3, 6]或者其他任何满足要求的答案
* @author Dell
*
*/
public class Test144 {
public static void rerange(int[] A)
{
if(A.length==0||A.length==1)
return;
int q=-1;
int p=0;
while(p<A.length)
{
if(A[p]<0)
{
q++;
int temp=A[p];
A[p]=A[q];
A[q]=temp;
}
p++;
}
int left=1;
int right=A.length-2;
if(A.length%2==1)
{
if(A[A.length/2]<0)
{
int temp2=A[A.length/2];
A[A.length/2]=A[A.length-1];
A[A.length-1]=temp2;
left=1;
right=A.length-3;
}
else
{
int temp3=A[A.length/2];
A[A.length/2]=A[0];
A[0]=temp3;
left=2;
right=A.length-2;
}
}
while(left<right)
{
int temp1=A[left];
A[left]=A[right];
A[right]=temp1;
left=left+2;
right=right-2;
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<a.length;i++)
{
a[i]=sc.nextInt();
}
rerange(a);
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
}