问题:
重新排序给定数组,使得下标index和数值A[index]的奇偶性一致。
Example 1: Input: [4,2,5,7] Output: [4,5,2,7] Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted. Note: 2 <= A.length <= 20000 A.length % 2 == 0 0 <= A[i] <= 1000
解法:
使用两个游标,o:代表奇数游标,e:代表偶数游标
遍历数组,每次递增2->始终指向奇数(偶数)index
直到A[o]和A[e]二者的奇偶性都不与自身游标一致。则交换二者。
(遍历到其中一个不一致,则停止移动游标,只移动另一个,一直到另一个也不一致)
代码参考:
1 class Solution { 2 public: 3 vector<int> sortArrayByParityII(vector<int>& A) { 4 int o=1, e=0;//o:奇数,e:偶数 5 while(o<A.size() && e<A.size()){ 6 if(A[e]%2!=0 && A[o]%2!=1){ 7 swap(A[e], A[o]); 8 e+=2; 9 o+=2; 10 }else{ 11 if(A[o]%2==1) o+=2; 12 if(A[e]%2==0) e+=2; 13 } 14 } 15 return A; 16 } 17 };
简化代码写法:
1 vector<int> sortArrayByParityII(vector<int>& A) { 2 for (int i = 0, j = 1; i < A.size(); i += 2, j += 2) { 3 while (i < A.size() && A[i] % 2 == 0) i += 2; 4 while (j < A.size() && A[j] % 2 == 1) j += 2; 5 if (i < A.size()) swap(A[i], A[j]); 6 } 7 return A; 8 }