给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明:
必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/mo…
解题思路:在原数组上操作无非两种方法,一是用双指针法,另外就是用数组的splice和push方法
方法一:
双指针法:先循环一次,统计0的个数,第二次循环,把数组的前面为0的步分都取代掉,第三次循环,把0放在数组的最后面
var moveZeroes = function(nums) {
let count = 0;
for(let i=0;i<nums.length;i++){
if(nums[i]==0){
count++
}
}
let j =0;
for(let i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[j]=nums[i];
j++
}
}
for(let i=1;i<=count;i++){
nums[nums.length-i]=0
}
}
方法二:
数组api法:
用循环时涉及到数组的删除要巧妙点设计for循环结构,因为splice只会删除元素不会删除长度,整体会往前移动,所以这个时候i是不能自增的,所以i++是不能放在循环条件里面的,先let len=nums.length,然后再操作len,整体思路是遇到0时删除nums[i],然后再push(0),在数组后面,
var moveZeroes = function(nums) {
let len = nums.length;
for(let i=0;i<len;){
if(nums[i]==0){
nums.splice(i,1);
nums.push(0);
len--
}
else{
i++
}
}
}