[路飞]_leetcode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

163 阅读1分钟

题目来源:leetcode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。  

提示:

0 <= nums.length <= 50000
0 <= nums[i] <= 10000

分析1 利用数组sort函数

  • 从实例中 输出:[1,3,2,4]与输出:[3,1,2,4]都是正确答案
  • 可以看出只与值取余的结果有关
  • 通过这一点我们可以进行从大到小排序

代码实现1 利用数组sort函数

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
    return nums.sort((a,b)=>b%2-a%2)
};

分析2 利用分治思想

  • 定义odd存放奇数,even存放奇数
  • 遍历nums将值取余2为0的存入even
  • 否则将值存入odd
  • 遍历完毕后通过odd.concat(even)将俩数组合并并返回

代码实现2 利用分治思想

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
    const odd = []
    const even = []
    for(let i = 0; i < nums.length; i++){
        if(nums[i] % 2 === 0){
            even.push(nums[i])
        }else{
            odd.push(nums[i])
        }
    }
    return odd.concat(even)
};

分析3 双指针

  • 定义left赋值为0
  • 定义right赋值为nums.length - 1
  • left对应的值为奇数并left < right,left++
  • right对应的值为偶数并left < right,right--
  • 将左右值进行交互
  • 最后返回nums

代码实现3 双指针

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
    let left = 0
    let right = nums.length - 1
    while(left < right){
        while(left < right && nums[left] % 2 == 1){
            left++
        }
        while(left < right && nums[right] % 2 == 0){
            right--
        }
        if (left < right) {
            [nums[left], nums[right]] = [nums[right], nums[left]];
        }
    }
    return nums
};

以上三种实现方式都可以通过位运算进行优化 (n&1)