两种方法解决移动零的问题 蠢方法和好方法
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104-231 <= nums[i] <= 231 - 1
题目分析
给了我们一个数组,需要我们把所有的零全部移到后面去,且不能复制数组,也就是得在原数组进行增删改查,或者用下标指针进行位置得调换。
蠢解法(当然是自己得解法啦)
先把含零得元素删了,再在后面添零,也就是对数组进行增删改查。
- 删 删怎么删呢?我们可以用数组自带得splice方法 splice()后面有两个参数,删除位置和删除个数。但是splice有个特性,会改变元素组得长度,所以你散掉一个零后数组长度就减小了,你的i--,不然就不是遍历后一个数了,而是后后一个数。
- 添 添的话就可以用push()方法,它是在数组末尾添加一个数,也是会修改原数组和改数组长度的,所以在删的时候加一个标记,删几个添加几个零。
上代码
var moveZeroes = function(nums) {
let len=nums.length
let tag=0
for(i=0;i<len;i++)
{
if(nums[i]===0){
nums.splice(i,1)
tag++
i--
}
}
}
好方法(用下标去交换位置)双指针 这里就引用leetcode网友的解法啦
var moveZeroes = function(nums) {
let slowIndex = 0;
for (let fastIndex = 0; fastIndex < nums.length; fastIndex++) {
if (nums[fastIndex] !== 0) {
[nums[slowIndex], nums[fastIndex]] = [nums[fastIndex], nums[slowIndex]];
slowIndex++;
}
}
};
设置两个指针,一个快一个慢,当数组没零的时候,两个指针是同步的,但是当有零存在,快指针就比慢指针快,从而交换位置,用一个for可以完成两个for的效果。看到这么优秀的解法,忍不住拿来用啦。 作者:zoking 链接:leetcode.cn/problems/mo… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。