给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一开始我是这么做的
var moveZeroes = function(nums) {
for(let i=0;i<nums.length;i++){
if(!nums[i]){
nums.splice(i,1);
nums.push(0);
}
}
}
结果通过了20%的测试用例,绞尽脑汁分析了一下(因为太笨了,没有一分钟根本反应不过来),是因为每次判断完,i都会++,这就会导致这个if循环是隔一个判断一个,离谱。接着我又在for循环里加了一句:
i--
发现运行时间超了,是的,如果加了i--,i还没来得及做++,就被减成了负数,还判断个锤子啊喂!在if外加一句i--也是一样的道理,那咋办呢?
既然可能会减成负数,那为什么不让i成为最大值呢?让负数成为循环的出口,于是~~
var moveZeroes = function(nums) {
var i = nums.length-1;
while(nums[i]!=undefined){
if(!nums[i]){
nums.splice(i,1);
nums.push(0);
}
i--;
}
};
奈斯!成功!yeah!