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

143 阅读2分钟

「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

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

示例:

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

提示:

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

解题思路

  • 老规矩,先说暴力解
  • 我们用两个数组分别存储奇数偶数
  • 将数组合并返回

解题代码

var exchange = function(nums) {
    let a = [] // 存奇数
    let b = [] // 存偶数
    nums.forEach(v=>{
        if(v%2){ // 对2取余有余数 为奇数
            a.push(v)
        }else{
            b.push(v)
        }
    })
    return [...a,...b]
};

当然,我们可以利用数组的方法还可以这样解

var exchange = function(nums) {
    let a = [] 
    nums.forEach(v=>{
        if(v%2){ 
            a.unshift(v) // 奇数塞到数组的第一项
        }else{
            a.push(v)  // 偶数塞到最后一项
        }
    })
    return a
};

双指针

当然,处理暴力解以外,我们还可以用双指针来解这道题

  • 定义一个指针从0向后,与此同时我们定义一个指针从后往前
  • 当两个指针相遇时退出循环
  • 如果左边能整除2于此用时右边不能整除2 ,我们就交换左右的位置
  • 否则两侧都能整除2时,右指针--
  • 同样的道理,两侧都不能整除2时,左指针++
var exchange = function(nums) {
    let left = 0 // 左指针
    let right = nums.length-1  // 右指针
    while(left<right){  // 两指针没相遇作为循环条件
        if(nums[left]%2===0&&nums[right]%2===1){
          [nums[right],nums[left]] = [nums[left],nums[right]]  // 交换位置
            left++  
            right--
        }else if(nums[left]%2===0){ // 左侧不满足,右侧满足时,寻找不满足的右侧
            right--
        }else{ 
            left++
        }
        
    }
    return nums
};

在喜欢你的人那里去热爱生活,在不喜欢你的人那里去看清世界。

如有任何问题或建议,欢迎留言讨论!