码迷,mamicode.com
首页 > 编程语言 > 详细

【剑指Offer-代码的完整性】面试题21:调整数组顺序使奇数位于偶数前面

时间:2020-03-09 13:50:18      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:思路   时间复杂度   size   复杂度   amp   数位   数组   第一个   tor   

题目描述

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

思路1

遍历整个数组,当遇到偶数时,将该偶数后面的数前移一个位置并把该偶数放到数组末尾。这个算法时间复杂度为O(n^2),但可以保证奇数和奇数,偶数和偶数之间的相对位置不变。代码如下:

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int len = array.size();
        if(len==0) return;
        
        int evenNums = 0;    //数组中偶数个数
        for(int i=0; i<len; i++)
            if(array[i]%2==0)
                evenNums++;
        int i=0;
        while(i<len && evenNums){    //注意循环条件
            if(array[i]%2==0){
                int t = array[i];
                for(int j=i; j<len-1; j++)
                    array[j] = array[j+1];
                array[len-1] = t;
                evenNums--;
            }
            else i++;    //只有当当前值为奇数时才+1
        }
    }
};

思路2

该解法类似于快速排序中的partition过程,维护两个指针p1, p2,p1初始指向数组第一个位置,p2指向数组末尾,然后p1向后移动,p2向前移动,当p1指向的值为偶数且p2指向的值为奇数时,交换p1,p2指向的值,直至p1>=p2。
技术图片

代码如下:

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int left = 0;
        int right = array.size()-1;
        while(left<right){
            while(left<right && array[left]%2!=0)
                left++;
            while(left<right && array[right]%2==0)
                right--;
            if(left<right){
                int t = array[left]; array[left]=array[right]; array[right]=t;
            }
        }
    }
};

该解法时间复杂度为O(n),但不能保证奇数和奇数,偶数和偶数之间的相对位置不变,所以在牛客网无法通过。

【剑指Offer-代码的完整性】面试题21:调整数组顺序使奇数位于偶数前面

标签:思路   时间复杂度   size   复杂度   amp   数位   数组   第一个   tor   

原文地址:https://www.cnblogs.com/flix/p/12448044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!