交错正负数

给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。
 注意事项
不需要保持正整数或者负整数原来的顺序。
样例

给出数组[-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]+" ");
     }

	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值