交错正负数
题目
给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。
注意事项
不需要保持正整数或者负整数原来的顺序。样例
给出数组[-1, -2, -3, 4, 5, 6],重新排序之后,变成[-1, 5, -2, 4, -3, 6]或者其他任何满足要求的答案
挑战
原地完成,没有额外的空间
题解
本题若要得到合理的答案,则数组中正负数的个数要么相等,要么比另一种数最多大1个。而题目没有保证正负数个数相等,所以需对数组进行预处理(数组长度为偶数时无需预处理),使得当正(负)数多时,数组第一个数为正(负)。
至于交错正负数的处理就很简单了,双指针遍历即可。
class Solution {
/**
* @param A: An integer array.
* @return: void
*/
public void rerange(int[] A) {
if (A.length % 2 == 1)
{
int count = 0;
int plus = 0;
int minus = 0;
for (int i=0;i<A.length;i++)
{
count += A[i] > 0 ? 1 : -1;
plus = A[i] > 0 ? i : plus;
minus = A[i] < 0 ? i : minus;
}
int i = count > 0 ? plus : minus;
swap(A,i,0);
}
range(A);
}
private void range(int[] A)
{
int left = 0;
while (left + 1 < A.length)
{
if (A[left] * A[left+1] < 0)
{
left++;
}
else
{
int j = A.length-1;
while (left < j)
{
if (A[left] * A[j] < 0)
{
swap(A,left+1,j);
left++;
break;
}
j--;
}
}
}
}
private void swap(int[] A, int a, int b)
{
int tmp = A[a];
A[a] = A[b];
A[b] = tmp;
}
}
Last Update 2016.10.17