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

91 阅读1分钟

题目

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

示例:

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

 

提示:

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

题解

本题可以采用双指针的思路,定义左右指针left, right分别指向数组两端,循环执行:

  1. 指针left 从左往右寻找偶数
  2. 指针right从右往左寻找奇数
  3. 将偶数nums[left]nums[right]进行交换

算法复杂度分析

  1. 时间复杂度O(N),N为数组的长度
  2. 空间复杂度O(1), 指针left, right使用了常数大小的额外空间

代码

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
    // 左指针指向数组第一个元素
    let left = 0;
    // 右指针指向数组最后一个元素
    let right = nums.length - 1;
      
    // 当左指针小于右指针,循环执行
    while(left < right) {
        // 从左往右找到第一个偶数
        while(nums[left] % 2 == 1) {
            left++;
        }
        // 从右往左找到第一个奇数
        while(nums[right] % 2 == 0) {
            right--;
        }
        
        // 如果指针越界,中断循环
        if (left >= right) break; 
        
        // 奇偶数交换
        let tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
        
        // 左指针向右
        left++;
        // 右指针向左
        right--;
    }
    return nums;
};

原题链接

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