1.给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。写一个函数实现此功能。
注意事项:
不需要保持正整数或者负整数原来的顺序。
挑战:
原地完成,没有额外的空间
格式:
输入第一行输入一个原始数组,最后输出重新排列后的数组。
样例输入:
[ -1,-2,-3,4,5,6 ]
样例输出:
[ -1,5,-2,4,-3,6 ]
解析(java编写):
package com.ever.test;
import java.io.IOException;
import java.util.Scanner;
/**
* 解题思路:
* 1.数组0个或1个元素时,直接返回
* 2.数组多个元素时,负数放在左边,整数放在右边:---------->(1).偶数个元素:从第二个元素开始arr[left](left=1)和arr[right](right=arr.length-1)交换,
* 然后left+2和right-2继续进行交换,直到 left>right为止
* ----------->(2).奇数个元素:奇数个元素,负整数(正整数)比正整数(负整数)多一个时,中间那个元素和最后一个元素交换,然后执行第一步(1)
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) throws IOException {
int m; // ------------数组长度
int[] arr; //-------------用数组接收
Scanner sc = new Scanner(System.in);
System.out.println("请输入该数组的长度m:");
m = sc.nextInt();
arr = new int[m];
for(int i = 0; i < m; i++){
System.out.println("依次输入该数组的各个元素:");
arr[i] = sc.nextInt();
}
range(arr); //------------调用函数
for (int i = 0; i < arr.length; i++) { //------------打印
System.out.print(arr[i]+"\t");
}
System.out.println();
}
public static void range(int[] arr)
{
if(arr.length==0||arr.length==1) //当数组长度为0或1时
return;
int a=-1;
int b=0;
while(b<arr.length) //负数放在左边,整数放在右边
{
if(arr[b]<0)
{
a++;
int temp=arr[b];
arr[b]=arr[a];
arr[a]=temp;
}
b++;
}
int left=1;
int right=arr.length-2;
if(arr.length%2==1) //奇数个元素,负整数比正整数多一个时,中间那个元素和最后一个元素交换
{
if(arr[arr.length/2]<0)
{
int temp2=arr[arr.length/2];
arr[arr.length/2]=arr[arr.length-1];
arr[arr.length-1]=temp2;
left=1;
right=arr.length-3;
}
else //正整数比负整数多一个时,中间那个元素和第一个元素交换
{
int temp3=arr[arr.length/2];
arr[arr.length/2]=arr[0];
arr[0]=temp3;
left=2;
right=arr.length-2;
}
}
while(left<right)
{
int temp1=arr[left];
arr[left]=arr[right];
arr[right]=temp1;
left=left+2;
right=right-2;
}
}
}