牛客JZ21-调整数组顺序使奇数位于偶数前面

问题描述

输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:0≤n≤5000,数组中每个数的值:0≤val≤10000
要求:时间复杂度: O ( n ) O(n) On,空间复杂度: O ( n ) O(n) On
进阶:时间复杂度: O ( n 2 ) O(n^2) On2,空间复杂度: O ( 1 ) O(1) O1

题目链接: https://www.nowcoder.com/practice/ef1f53ef31ca408cada5093c8780f44b?tpId=13&tqId=1374930&ru=%2Fpractice%2F0c1b486d987b4269b398fee374584fc8&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=

示例

示例1
输入:[1,2,3,4]
返回值:[1,3,2,4]

示例2
输入:[2,4,6,5,7]
返回值:[5,7,2,4,6]

示例3
输入:[1,3,5,6,7]
返回值:[1,3,5,7,6]

具体思路

  首先可以考虑相对位置可以变化的情况
题目链接: 牛客JZ81:https://www.nowcoder.com/practice/0c1b486d987b4269b398fee374584fc8?tpId=13&tqId=2221866&ru=%2Fpractice%2Fef1f53ef31ca408cada5093c8780f44b&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=

  可以通过左右下标的方法,left下标找到偶数,right下标找到奇数,然后进行交换,left是奇数就++left,right是偶数就–right,一次类推完成所有数据的交换,但是这种方式是无法保证奇数和奇数,还有偶数和偶数的相对位置不变的。
在这里插入图片描述

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> reOrderArrayTwo(vector<int>& array) {
        // write code here
        int left =0;
        int right=array.size()-1;

        while(left<right)
        {
            while(left<right&&(array[left]&1))  //左指针找偶数
            {
                left++;
            }

            while(left<right&&!(array[right]&1))  //右指针找奇数
            {
                right--;
            }

            if(left<right)    //进行奇数和偶数的交换
            {
                int tmp=array[left];
                array[left]=array[right];
                array[right]=tmp;
            }
        }
        return array;    //返回整个数组
    }
};

思路一

  首先遍历整个数组,查找数组中的奇数,找到后将它临时保存起来,然后将该奇数位置之前的所有偶数都向后移动一位,最后将该奇数放到移动后的空闲位置处,依次类推,就可以完成不改变顺序的奇数在前偶数在后的数组排序。

在这里插入图片描述

代码实现

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> reOrderArray(vector<int>& array) {
        // write code here
        if(array.empty())
        {
            return {};
        }

        int k=0;
        for(int i=0;i<array.size();i++)
        {
            if((array[i]&1)==1)  //判断是否为奇数
            {
                int tmp=array[i];   //保存奇数的值
                int j=i;
                while(j>k)
                 {
                     array[j]=array[j-1];   //将k后面的偶数各向后移动一位
                     j--;
                 }
                array[k++]=tmp;   //将奇数放入移动后空闲的位置
            } 
        }
        return array;
    }
};
  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值