LintCode-交错正负数

给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。

样例

给出数组[-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++;
        }
    }
   
};
    原文作者:LintCode题目解答
    原文地址: https://blog.csdn.net/wangyuquanliuli/article/details/45816725
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞