题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题解:
一种是数字的相对位置不变,即1,2,3,4 -》 1,3,2,4
这样只能使用额外空间了,牛客题解就是这个
1 class Solution { 2 public: 3 void reOrderArray(vector<int> &array) { 4 if (array.size() < 2)return; 5 vector<int>eventV; 6 int oddPot = 0; 7 for (int i = 0; i < array.size(); ++i) 8 { 9 if (array[i] & 0x01 != 0)//奇数 10 { 11 array[oddPot] = array[i]; 12 ++oddPot; 13 } 14 else 15 eventV.push_back(array[i]); 16 } 17 for (int i = 0; i < eventV.size(); ++i) 18 array[oddPot++] = eventV[i]; 19 } 20 };
另一种优化的方法,就是使用头尾双指针,一旦头指针为偶数,尾指针为奇数,则立即交换,不用任何额外空间,遍历一遍完事,但相对位置会改变
1 class Solution01 { 2 public: 3 void reOrderArray(vector<int> &array) { 4 if (array.size() < 2)return; 5 int L = 0, R = array.size() - 1; 6 while (L < R) 7 { 8 if (func(array[L]))//是奇数 9 ++L; 10 if (!func(array[R]))//是偶数 11 --R; 12 if (!func(array[L]) && func(array[R])) 13 { 14 swap(array[L], array[R]); 15 ++L; 16 --R; 17 } 18 } 19 } 20 bool func(int x) 21 { 22 return x & 0x01; 23 } 24 };