题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾。
示例:
输入: [0,1,0,3,12]
输出: [12,1,3,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
分析:
- 双指针,左指针在头,右指针在尾
- 左指针在为0时,与非0的右指针交换。然后右指针向左移动
- 左指针向右移动
- 如果右指针为0,则向左移动
代码:
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let left = 0, right = nums.length - 1;
if (n <= 1) {
return;
}
while (left < right) {
if (nums[left] == 0 && nums[right]) {
nums[left] = nums[left] ^ nums[right];
nums[right] = nums[left] ^ nums[right];
nums[left] = nums[left] ^ nums[right];
right--;
}
left++;
if (nums[right] == 0) {
right--;
}
}
};
变形题
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
分析:
- 双指针,左右指针都在头
- 快指针向前寻找非0元素,慢指针寻找0元素
- 当快指针找到非0元素,即和慢指针交换
代码:
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let left = 0, right = 0, n = nums.length;
if (n <= 1) {
return;
}
while (right < n && left < n) {
if (right != left && nums[right] && nums[left] == 0) {
nums[right] = nums[left] ^ nums[right];
nums[left] = nums[left] ^ nums[right];
nums[right] = nums[left] ^ nums[right];
left++;
}
right++;
if (nums[left]) {
left++;
}
}
};