剑指offer 13、调整数组顺序使奇数在偶数前面 python和c++

题目描述:

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

思路:遍历整个数组,奇数放在一个数组里,偶数放在另一个数组里。然后结合起来

python 版

# -*- coding:utf-8 -*-
class Solution:
    def reOrderArray(self, array):
        # write code here
        array1=[]           #用来存奇数
        array2=[]           #用来存偶数
        for i in range(len(array)):
            if array[i]%2!=0:
                array1.append(array[i])
            else:
                array2.append(array[i])
        ans = array1+array2
        return ans

本来相把这样的思路带到c++里面的,发现c++给的函数是没返回值的,而且传的参数是数组的引用,意思是让我们直接改动这个数组,

思路还是大同小异的:找到偶数放到里一个 vector 里面,然后直接从当前的数组把这个数删除,最后原始数组剩下的就是奇数了

值得注意的点是删除了偶数后,它后面的所有的元素都向前移动了一位。所以我的的迭代器++不能在删除的同时进行,也就是说我们在删除完偶数后还要对当前迭代器进行判断(原因是,删除后的迭代器的内容其实是删除前的后一个内容)

c++ 版

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> temp;
        vector<int>::iterator ib1;
        ib1 = array.begin();
        for (; ib1 != array.end();){            //遇见偶数,就保存到新数组,同时从原数组中删除
            if (*ib1 % 2 == 0) {
                temp.push_back(*ib1);
                ib1 = array.erase(ib1);
            }
            else{
                ib1++;
            }
        }
        vector<int>::iterator ib2, ie2;
        ib2 = temp.begin();
        ie2 = temp.end();
        for (; ib2 != ie2; ++ib2){             //将新数组的数添加到老数组
            array.push_back(*ib2);
        }
    }
};

------------分割线------------------------

看到一个大佬的做法,挺强,将这个问题类比成了冒泡拍序,

解释一下为什么类似于排序,排序要求大的在前面,小的在后面。我们的问题目的是奇数在前面,偶数在后面。

冒泡的时候,从后往前,相邻两个作比较,保证大的在前,小的在后,循环到最后。那么我们这个问题也可以从后往前,相邻两个数作比较奇数在前偶数在后,循环最后的到的就是答案了。

而且这样也不会改变他们的相对位置

c++版

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]);
                }
            }
        }
    }
};
posted on 2021-06-10 17:23  雾恋过往  阅读(42)  评论(0编辑  收藏  举报

Live2D