剑指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]);
}
}
}
}
};