题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入: nums = [1,2,3,4]
输出: [1,3,2,4]
注: [3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 500000 <= nums[i] <= 10000
题解
本题可以采用双指针的思路,定义左右指针left, right分别指向数组两端,循环执行:
- 指针
left从左往右寻找偶数 - 指针
right从右往左寻找奇数 - 将偶数
nums[left]与nums[right]进行交换
算法复杂度分析
- 时间复杂度
O(N),N为数组的长度 - 空间复杂度
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;
};