题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
我的思路(从繁到简):
(1)新建两个数组A、B,遍历原数组,奇数存到A,偶数存到B,最后把AB合在一起即可。
(2)新建一个数组A:①遍历原数组,先把原数组中的奇数存到A中,再遍历一次,把原数组的偶数存在A中,输出新数组;②遍历原数组,保留奇数,将偶数存到新建的数组A,最后把数组A合到原数组,再输出。
(3)不新建数组,使用指针用来交换前后两个元素。(第三个方法是剑指offer的方法,但不符合题目相对位置不变的要求。)
(4)除此之外还百度到一个新的更简单的方法:创建双向队列,遍历数组,奇数前插入,偶数后插入。最后使用assign方法实现不同容器但相容的类型赋值(参考链接:http://cuijiahua.com/blog/2017/11/basis_13.html)
针对思路2的编程实现:(3ms 512K)
class Solution { public: void reOrderArray(vector<int> &array) { vector<int> result; result = array; int num = array.size(); int j = 0; for(int i=0;i<num;i++){ if(array[i]%2==1 && j < num){ result[j++] = array[i]; } } for(int m = 0;m<num;m++){ if(array[m]%2==0 && j<num){ result[j++] = array[m]; } } array = result; } };针对思路4的编程实现:(4ms 480K)
class Solution { public: void reOrderArray(vector<int> &array) { deque<int> result; int num = array.size(); for(int i=0;i<num;i++){ if(array[num - i - 1]%2==1){ result.push_front(array[num - i - 1]); } if(array[i] %2 == 0){ result.push_back(array[i]); } } array.assign(result.begin(),result.end()); } };