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

题目描述

在这里插入图片描述

题目分析
思路一:
  • 如果不考虑复杂度问题的话,则最简单的思路是从头扫描整个数组,每碰到一个偶数,拿出这个数字,并且把这个数字后面所有的数字都往前挪动一位,挪完之后的数组,最后面有一个空位,这个时候我们把这个偶数放在这个空余的位置上就好了。但是由于每次碰到一个偶数就需要挪动n个数字,因此,这种算法的总的时间复杂度为O(n^2),所以说,其实这种算法的时间效率并不是很高。
  • 碰到不满足题目要求的地方,就对数组中的元素进行交换的操作就可以了
class Solution {
public:
    void reOrderArray(vector<int> &array) 
    {
        for (int i = 0; i < array.size();i++)
        {
            for (int j = array.size() - 1; j>i;j--)
            {
                if (array[j] % 2 == 1 && array[j - 1]%2 == 0) 
                {
                    swap(array[j], array[j-1]);
                }
            }
        }
    }
};
思路二:
  • 这道题目的要求是使得所有的奇数全部位于偶数的前面,也就是说,我们在扫描这个数组的时候,如果有发现偶数出现在奇数的前面,那么我们就交换他们的顺序,交换顺序之后,就是符合要求的了。
  • 因此,我们可以使用两个指针,第一个指针指向数组的第一个元素,他只会向后移动,第二个指针指向数组的最后一个元素,他只会向前移动,在两个指针相遇之前,第一个指针总是处于第二个指针的前面,如果第一个指针指向的是偶数,第二个指针指向的是奇数,那么就交换这两个指针的位置。
  • 但是我通过运行指针交换的方法,无法通过代码所有的测试用例,因为指针的交换方法,会改变元素的相对位置,不满足题目的要求,所以不能完成交换
思路三:vector的动态数组来进行代码的编写
代码如下所示:
class Solution {
public:
    void reOrderArray(vector<int> &array) 
    {
        vector<int>odday;
        vector<int>evenay;
        int n=array.size();
        for(int i=0;i<n;i++)
        {
            if(array[i]%2==1)
                odday.push_back(array[i]);
            else
                evenay.push_back(array[i]);
        }
        array.clear();
        for(int i=0;i<odday.size();i++)
           array.push_back(odday[i]);
        for(int i=0;i<evenay.size();i++)
           array.push_back(evenay[i]);
    }
};
测试用例
  • 功能测试(输入数组中的奇数,偶数交替出现;输入的数组中所有的偶数都出现在奇数的后面;输入的数组中所有的奇数都出现在偶数的前面
  • 特殊的输入测试(输入nullptr指针;输入的数组中只有一个数字)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值