本文最后更新于:2023年3月19日 晚上
                
              
            
            
              Lt922. 按奇偶排序数组 II
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
你可以返回任何满足上述条件的数组作为答案。
示例:
1 2 3
   | 输入:[4,2,5,7] 输出:[4,5,2,7] 解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
 
  | 
 
提示:
2 <= A.length <= 20000 
A.length % 2 == 0 
0 <= A[i] <= 1000 
思路
额外双数组
把原数组奇数偶数分别提取出来,再按偶数奇数的顺序添加回去。
原地修改
遍历一次数组,判断当前位置的元素是否符合要求。例如判断当前是否下标和数都为偶数,不符合就去之后元素中找一个,数为偶数,但是下标为奇数的数,将两个元素交换。
单数组
使用单结果数组,分别使用奇数下标和偶数下标记录元素应该放置的位置,每次放置以后都令下标加 2。
解答
额外双数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | 
 
 
  var sortArrayByParityII = function (A) {   const oddArr = A.filter((e) => e % 2 !== 0);   const evenArr = A.filter((e) => e % 2 === 0);   const res = [];   while (oddArr.length) {     res.push(evenArr.pop());     res.push(oddArr.pop());   }   return res; };
 
  | 
 
原地修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
   | 
 
 
  var sortArrayByParityII = function (A) {   for (let i = 0; i < A.length; i++) {     if (i % 2 === 0) {       if (A[i] % 2 === 0) continue;       else {         let j = i + 1;         while (j < A.length) {           if (A[j] % 2 === 0) {             [A[i], A[j]] = [A[j], A[i]];             break;           }           j += 2;         }       }     } else {       if (A[i] % 2 !== 0) continue;       else {         let j = i + 1;         while (j < A.length) {           if (A[j] % 2 !== 0) {             [A[i], A[j]] = [A[j], A[i]];             break;           }           j += 2;         }       }     }   }   return A; };
 
  | 
 
单数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | 
 
 
  var sortArrayByParityII = function (A) {   const res = [];   let eIndex = 0,     oIndex = 1;   for (const num of A) {     if (num % 2 === 0) {       res[eIndex] = num;       eIndex += 2;     } else {       res[oIndex] = num;       oIndex += 2;     }   }   return res; };
 
  |