要求:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
* 注意:剑指offer中的面试题21 和 牛客网的题目要求不一样,区别在于下划线部分,剑指offer书中没有要求相对位置不变
class Solution { public: void reOrderArray(vector<int> &array) { } };
解题代码:
(1)相对位置不变的解法:
借用辅助数组,先将偶数存放到辅助数组中,同时将该偶数从原数组中删除,最后将两个数组合并。
1 class Solution { 2 public: 3 void reOrderArray(vector<int> &array) { 4 vector<int> temp; 5 vector<int>:: iterator it; 6 for(it = array.begin(); it != array.end(); ){ 7 if(*it % 2 == 0){ 8 temp.push_back(*it); 9 it = array.erase(it); 10 } 11 else 12 it++; 13 } 14 15 for(it = temp.begin(); it != temp.end(); it++){ 16 array.push_back(*it); 17 } 18 } 19 };
(2)相对位置可变的解法:
1 class Solution { 2 public: 3 void reOrderArray(vector<int> &array) { 4 if(array.size() <= 1) 5 return ; 6 7 int start = 0; 8 int end = array.size()-1; 9 while(start < end){ 10 while(start < end && array[start] % 2 == 1) 11 start++; 12 while(start < end & array[end] % 2 == 0) 13 end--; 14 15 if(start < end) 16 swap(array[start], array[end]); 17 } 18 } 19 };