当前位置:   article > 正文

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

牛客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;    //返回整个数组
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

思路一

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

在这里插入图片描述

代码实现

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;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/322764
推荐阅读
相关标签
  

闽ICP备14008679号