[前端]_一起刷leetcode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

143 阅读2分钟

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

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

 

示例:

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

 

提示:

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

思路

  1. 用指针的概念,记录一下奇数的个数;
  2. 一轮遍历,如果遇到的是奇数,把它跟到指针所在的位置交换节点值,指针往后移动一位;
  3. 如果遇到的偶数不做处理,遍历结束直接返回即可。

实现

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
    let pIndex = 0;

    for (let i = 0; i < nums.length; i++) {
        if (nums[i] % 2 === 1) {
            [ nums[i], nums[pIndex] ] = [ nums[pIndex], nums[i] ];
            pIndex++;
        }
    }

    return nums;
};

双指针

我们也可以通过左右两根指针来分别记录奇数位和偶数位的个数,分别从数组的两侧开始寻找,左侧找奇数,右侧找偶数。然后每次遍历所有元素,找到第一个奇数位和第一个偶数位的所在位置,交换元素的位置即可。

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
    const n = nums.length;
    let left = 0, right = n - 1;

    while (left < right) {
        while (left < right && nums[left] % 2 === 1) {
            left++
        }

        while (left < right && nums[right] % 2 === 0) {
            right--;
        }

        [ nums[left], nums[right] ] = [ nums[right], nums[left] ];
    }

    return nums;
};

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。