题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入: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;
};