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 &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;i0)||(!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 &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(cur0)j++;
            }
            else
            {
                swap(A[cur],A[j]);
                j++;
                while(j0)j++;
                while(i


你可能感兴趣的:(算法,面试)