题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路
题目要求不改变调整前后奇偶元素之间的相对位置。所以可以借鉴冒泡的思路。
即:当遍历到元素x为偶数时,将其调整到数组最后一位,此时,需要判断原数组x之后的一个数的奇偶情况,如果该数为偶数,则继续调整这个数,如果该数为奇数则跳过该数判断下一个元素。
class Solution { public: void reOrderArray(vector<int> &array) { if (array.empty()) return; int n = array.size(); int tmp = 0; for (int i = 0; i < n-tmp; ) { if (array[i] % 2 == 0) { for (int j = i+1; j < n; ++j) { swap(array[j], array[j-1]); } tmp++; } if (array[i] % 2 != 0) i++; } } };
同上利用冒泡排序,该思路交换次数较少,从后向前遍历,如果j-1为偶,j为奇,则交换,否则跳过。
class Solution { public: void reOrderArray(vector<int> &array) { if (array.empty()) return; int n = array.size(); for (int i = 0; i < n; ++i) { for (int j = n-1; j > i; --j) { if (array[j-1] % 2 == 0 && array[j] % 2 != 0) swap(array[j-1], array[j]); } } } };
利用vector临时数组来存储偶数值,遍历时找出偶数后并删除放入临时数组中,遍历结束后然后将临时数组中元素放入原数组的尾部。
class Solution { public: void reOrderArray(vector<int> &array) { if (array.empty()) return; vector<int> tmp; for (auto it = array.begin(); it != array.end(); ++it) { if (*it % 2 == 0) { tmp.push_back(*it); it = array.erase(it); it--; } } for (auto it = tmp.begin(); it != tmp.end(); ++it) array.push_back(*it); } };