LeetCode283 移动零 & 剑指Offer 21 调整数组顺序使奇数位于偶数前面

LeetCode283 移动零

题目

在这里插入图片描述
LeetCode27 移除元素 基本一样,27 题移除题目给出的 value,283 题直接告知 value 是 0。但是这道题要 保持非零元素的相对顺序,所以 27 题中的第二种解法没办法使用。而且移动到末尾的零也要在数组中,所以不能像 27 题直接覆盖:nums[slow] = nums[fast],而要进行交换

注意是 交换,可不能用 nums[slow] = nums[fast]; nums[fast] = 0:因为 如果没有出现 0,fast 和 slow 会指向同一个元素;如果这么写,[1,2,3,4,5] 输出时就变成 [0,0,0,0,0] 咯。

解题:快慢指针

在这里插入图片描述
如果没有出现 0,fast 和 slow 会指向同一个元素;如果出现 0,slow 会停在 0 处,等待 fast 扫描到非 0 的 nums[fast] 来进行交换。

// javascript
var moveZeroes = function(nums) {
    const n = nums.length;
    let fast = 0, slow = 0;
    while (fast < n) {
        if (nums[fast] !== 0) {
            swap(nums, fast, slow);
            slow++;
        }
        fast++;
    }
};

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

在这里插入图片描述

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

题目

在这里插入图片描述

解题:快慢指针

把题目换种说法:把所有的偶数移到数组的末尾。如此一来,是不是和 283 题要解决的问题一样?唯一不同是本题要判断 fast 指针指向的是不是奇数

下面的写法可以保持奇数元素的相对顺序,偶数的相对顺序可能会改变,比如 [1,2,4,3] 改变后是 [1,3,4,2], [1,2,4,3,5] 改变后是 [1,3,5,2,4]。

// javascript
var exchange = function(nums) {
    const n = nums.length;
    let fast = 0, slow = 0;
    while (fast < n) {
        if ((nums[fast] & 1) === 1) {
            swap(nums, fast, slow);
            slow++;
        }
        fast++;
    }
    return nums;
};

const swap = (nums, i, j) => {
    if (i === j) return;
    const temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值