JZ13 — 调整数组顺序使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

题目分析

如果可以开辟新的数组,非常简单。
例如:

class Solution
{
public:
    void reOrderArray(vector<int> &array)
    {
        vector<int> odd;  //奇数
        vector<int> even; //偶数
        for (int i = 0; i < array.size(); i++)
        {
            if (array[i] % 2)
                odd.push_back(array[i]);
            else
                even.push_back(array[i]);
        }
        array.clear();
        for (int i = 0; i < odd.size(); i++)
            array.push_back(odd[i]);
        for (int i = 0; i < even.size(); i++)
            array.push_back(even[i]);
    }
};

如果不可以开辟新的数组,可以使用如下策略:
使用变量index记录插入位置,初始值为0.遍历原数组,如果为奇数,则将[index, i-1]的数据都向右移动一个单位。然后将数据插入到位置index中。令index++

class Solution
{
public:
    void reOrderArray(vector<int> &array)
    {
        int temp, index = 0;
        for (int i = 0; i < array.size(); i++)
        {
            if (array[i] % 2)
            {
                temp = array[i];
                for (int j = i; j > index; j--)
                    array[j] = array[j - 1];
                array[index++] = temp;
            }
        }
    }
};

时间复杂度为O(n^2)

By The Way

判断奇偶性除了可以用n % 2,还可以用n & 1

Java

public class Solution {
    public void reOrderArray(int[] array) {
        int index = 0, temp;
        for (int i = 0; i < array.length; i++) {
            if ((array[i] & 1) == 1) {
                temp = array[i];
                for (int j = i; j > index; j--)
                    array[j] = array[j - 1];
                array[index++] = temp;
            }
        }
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部