解题思路
考虑定义双指针 , 分列数组左右两端,循环执行:
- 指针 从左向右寻找偶数;
- 指针 从右向左寻找奇数;
- 将 偶数 和 奇数 交换。
可始终保证: 指针 左边都是奇数,指针 右边都是偶数 。
算法流程
- 初始化: , 双指针,分别指向数组 左右两端;
- 循环交换: 当 时跳出;
- 指针 遇到奇数则执行 跳过,直到找到偶数;
- 指针 遇到偶数则执行 跳过,直到找到奇数;
- 交换 和 值;
- 返回值: 返回已修改的 数组。
复杂度分析
- 时间复杂度 : 为数组 长度,双指针 , 共同遍历整个数组。
- 空间复杂度 : 双指针 , 使用常数大小的额外空间。
代码
javascript
/**
* @param {number[]} nums
* @return {number[]}
*/
var exchange = function(nums) {
let l = 0;
let r = nums.length - 1;
while(l <= r) {
if(nums[l] % 2 !== 0) {
l++;
continue;
}
if(nums[r] % 2 === 0) {
r--;
continue;
}
let left = nums[l];
nums[l] = nums[r];
nums[r] = left;
}
return nums;
};