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

130 阅读1分钟

题目描述

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

解题思路

算法

双指针,左指针 l 指向第一个需要交换的左边元素, r 指向第一个需要交换的右边元素

过程

我们用的是双指针,他们的作用是不断地查找需要交换的元素,那么什么是需要交换的元素?

因为我们要左奇右偶,因此需要把奇数交换到左边,所以 l 要指向的,实际上就是偶数的索引,我们把它给交换到右边去,r 则是相反~

我们通过 while 循环不断查找,知道二者相遇

代码

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
    let l = 0, r = nums.length - 1

    while (l < r) {
        while (l < r && nums[l] % 2 !== 0) l++
        while (l < r && nums[r] % 2 === 0) r--

        ;[nums[l], nums[r]] = [nums[r], nums[l]]
    }

    return nums
};