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;
};