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

题目

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

 

示例:

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

提示:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

JS实现

参考1: 两次遍历

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var exchange = function(nums) {
	const result = [];

	//第一次遍历,添加奇数
	for(let num of nums){
		if(num % 2 != 0){
			result.push(num);
		}
	}

	//第二次遍历,添加偶数
	for(let num of nums){
		if(num % 2 === 0){
			result.push(num);
		}
	}
	return result;
};

参考2:头尾双指针

定义头指针 left ,尾指针 right . left 一直往右移,直到它指向的值为偶数 right 一直往左移, 直到它指向的值为奇数 交换 nums[left] 和 nums[right] . 重复上述操作,直到 left == right

console.log(2 & 1); //0,是偶数
console.log(1 & 1); //1,是奇数
var exchange = function (nums) {
  let left = 0,
    right = nums.length - 1;

  const swap = (i, j) => {
    const temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
  };

  while (left < right) {
    //非偶数时,右移,直到是偶数
    if ((nums[left] & 1) != 0) {
      left++;
      continue;
    }
    //非奇数时,左移,直到是奇数
    if ((nums[right] & 1) != 1) {
      right--;
      continue;
    }
    //奇数与偶数互换位置,使奇数在前,偶数在后
    swap(left, right);
  }
  return nums;
};

参考3:快慢双指针

定义快慢双指针 fast 和 low ,fast 在前, low 在后 . fast 的作用是向前搜索奇数位置,low 的作用是指向下一个奇数应当存放的位置 fast 向前移动,当它搜索到奇数时,将它和 nums[low] 交换,此时 low 向前移动一个位置 . 重复上述操作,直到 fast 指向数组末尾 .

var exchange = function (nums) {
  let fast = 0,
    slow = 0;

  const swap = (i, j) => {
    const temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
  };

  while (fast < nums.length) {
    //nums[fast]是奇数时,把nums[fast]与nums[slow]交换
    if (nums[fast] & (1 === 1)) {
      swap(slow, fast);
      slow++;
    }
    fast++;
  }
  return nums;
};