正负相间重排列数组元素

给一个包含正负整数的数组,要求对这个数组中的数进行重新排列,使得其正负交替出现。首先出现正数,然后是负数,然后是正数。有多余的一方,就放在末尾。

如 [1,2,3,-4]->[-4,1,2,3]
[1,-3,2,-4,-5]->[-3,1,-4,2,-5]
————————————————
解题思路:

1、首先判断数组中前两个数是否是正负交叉的,通过乘积是否大于零来判断,如果小于零按照题目要求正负顺序调整两个数之后继续判断下两个数,如果大于零,进行第2步。
2、首先确定以第一个数(i)为基准,然后向后查找第一个与之符号相反的位置(j),找到位置后进行第3步;如果找不到(j>=n)的话,跳出循环,进行第4步。
3、将确定好的位置之前的数依次交换,类似于冒泡,将找到的这个第一个与之符号相反的数放在(i)的后面,并按照题目要求正负顺序调整元素顺序
4、然后再判断第二个数(++i),直到最后一个数结束。
————————————————

#include <iostream>
#include <vector>

using namespace std;
class Solution
{
public:
    void reOrderArray(vector<int>& array)
    {
        if (array.size() <= 1)//只有一个或者为空直接返回
            return;
        int n = array.size();
        for (int i = 0; i < n-1; i++)
        {
            if (array[i] * array[i + 1] > 0)//两个数均为正数或者负数
            {
                int j = i + 1;
                while (j < n  && array[i] * array[j]>0)
                    ++j;
                if (j == n )
                    break;
                else//将确定好的位置之前的数依次交换,类似于冒泡,将找到的这个第一个与之符号相反的数放在(i)的后面
                {
                    for (int k = j; k > i + 1;k--)//k>i+1,是因为交换的是array[k]和array[k - 1]
                        swap(array[k], array[k - 1]);
                }
                if (array[i] < 0)//调整为正负顺序
                    swap(array[i], array[i + 1]);
                i += 1;
            }
            else//本就是正负两个,调整为正负顺序
            {
                if (array[i] < 0)
                    swap(array[i], array[i + 1]);
                i += 1;
            }
        }
    }

};
int main(int argc, char** argv)
{
    vector<int> arr = { 2,8,-9,4,7,11,-7,-14 };
    cout << "the arr is : \n" << endl;
    for (int i = 0; i < arr.size(); i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
    Solution a;
    a.reOrderArray(arr);
    cout << "the result is : \n" << endl;
    for (int i = 0; i < arr.size(); i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

 

posted @ 2022-03-08 22:47  justloving  阅读(136)  评论(0编辑  收藏  举报