【剑指offer】调整数组顺序使奇数位于偶数前面 python+c++

544 阅读1分钟

【题目描述】

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

【思路】

【1】如果没有要求保持相对位置不变的话,就比较简单。通过双指针,p1从前向后遍历找偶数,p2从后向前遍历找奇数,一旦找到就交换二者位置。相当于while循环中,再执行两个while循环。时间复杂度O(n).

【2】要求保持相对位置不变的话,就新建一个长度相同的数组re用于保存结果。在两个数组上都是用双指针。详见代码.

【代码】

C++:
class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> re=array;
        int left=0;
        int len=array.size();
        int right=len-1;
        for(int arr_left=0;arr_left<len;arr_left++){
            int arr_right=len-1-arr_left;
            if(array[arr_left]%2==1){
                re[left]=array[arr_left];
                left+=1;
            }
            if(array[arr_right]%2==0){
                re[right]=array[arr_right];
                right-=1;
            }
        }
        array=re;
    }
};
Python:
# -*- coding:utf-8 -*-
class Solution:
    def reOrderArray(self, array):
        re=[0 for _ in range(len(array))]
        re_left=0
        re_right=len(re)-1
        for arr_left in range(len(re)):
            arr_right=len(re)-1-arr_left
            if(array[arr_left]%2==1):
                re[re_left]=array[arr_left]
                re_left+=1
            if(array[arr_right]%2==0):
                re[re_right]=array[arr_right]
                re_right-=1
        return re