题目:
- 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
// Solution One -- 计数移动位置 68ms 35.8mb
// 统计零的个数,当零的个数大于0且遇上不等于0的将之向前替换;最后替换结束,数组中还缺少count0个0,逆序替换为0
var moveZeroes0 = function(nums) {
let len = nums.length
if(len <= 1) return nums
let index0 = nums.indexOf(0)
if(index0 === -1) return nums
let count0 = 1
for(let i = index0 + 1; i < len; i++){
if(nums[i] !== 0 && count0 > 0){
nums[index0] = nums[i]
index0++
}else{
count0 += 1
}
}
if(count0 > 0){
for(let i = len-1; count0 > 0; i--,count0--){
nums[i] = 0
}
}
};
// Solution Two -- 双指针 68ms 35.8mb
var moveZeroes1 = function(nums) {
let i = 0, j=0
while(i < nums.length){
if (nums[i] != 0){
if (j < i){
nums[j] = nums[i]
nums[i] = 0
}
j++
}
i++
}
return nums
};
// 位位交换 64ms 36.5mb
var moveZeroes2 = function(nums) {
let j = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
[nums[j], nums[i]] = [nums[i], nums[j]]; //swap交换
j++;
}
}
};