给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。
样例
给出数组[-1, -2, -3, 4, 5, 6]
,重新排序之后,变成[-1, 5, -2, 4, -3, 6]
或者其他任何满足要求的答案
注意
不需要保持正整数或者负整数原来的顺序。
挑战
原地完成,没有额外的空间
分析:如果正数多那么第一个数应该是正数,反之也成立,确定每一位的符号,然后从后面选就行,复杂度为O(n^2),不清楚有没有更优的。
代码:
class Solution {
public:
/**
* @param A: An integer array.
* @return: void
*/
void rerange(vector<int> &A) {
// write your code here
int pos = 0;
for(auto x:A)
if(x>0)
pos++;
int neg = A.size()-pos;
bool flag = (pos>neg);
for(int i=0;i<A.size();i++)
{
for(int j=i;j<A.size();j++)
{
if((flag&&A[j]>0)||(!flag&&A[j]<0))
{
swap(A[i],A[j]);
break;
}
}
flag = 1-flag;
}
}
};
今天又重新思考了下这题,想到数据的问题,一般都可以用两根指针来解决,不是两个指针对着走,就是两根指针往相同方向走,这道题里可以用一根指针指向下一个负的,一根指针指向下一个正的,然后当前需要啥符号的,就和那根指针进行交换,再调整指针。
代码:
class Solution {
public:
/**
* @param A: An integer array.
* @return: void
*/
void rerange(vector<int> &A) {
// write your code here
int positive = 0;
int negitive = 0;
for(auto i:A)
{
if(i>0)
positive++;
else
negitive++;
}
int i = 0;
int j = 0;
bool curPositive = true;
if(negitive>positive)
curPositive = false;
while(A[i]<0)
i++;
while(A[j]>0)
j++;
int cur = 0;
while(cur<A.size())
{
if(curPositive)
{
swap(A[cur],A[i]);
i++;
while(i<A.size()&&A[i]<0)i++;
while(j<A.size()&&A[j]>0)j++;
}
else
{
swap(A[cur],A[j]);
j++;
while(j<A.size()&&A[j]>0)j++;
while(i<A.size()&&A[i]<0)i++;
}
curPositive = 1-curPositive;
cur++;
}
}
};