LeetCode 283 移动零
283. 移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
解法1
思路: 使用 变量 j 来标记0所在的位置,使用 **变量i **来遍历整个数组,当 i所在的位置 不为零的时候,把 j 所在的位置赋值为 nums[j], 然后把nums[i]的值设为0,此时j位置的值已经正确,然后把j的值自增
结果: 使用js的时候,涉及到类型转换.当我用 != 的时候, 执行用时 :56 ms, 在所有 JavaScript 提交中击败了99.89%的用户.当我用 !== 的时候, 才打败了14.5%的用户……这是为啥呢???
/** * @param {number[]} nums * @return {void} Do not return anything, modify nums in-place instead. */ var moveZeroes = function(nums) { let j = 0 for(let i = 0; i < nums.length; i++) { if(nums[i] != 0) { nums[j] = nums[i] if(i != j) { nums[i] = 0 } j ++ } } };
解法2
思路: 设遍历整个数组,每遇到一个0,遍把这个0从数组中删掉,然后在数组的最后面插入一个0
结果: 由于多次使用splice()方法,splice()方法本质上还是把数组全部往前挪了一遍,导致程序性能稍微差一点…不过属于还可以接受那种
/** * @param {number[]} nums * @return {void} Do not return anything, modify nums in-place instead. */ var moveZeroes = function(nums) { let zeroCount = 0; for( let i = 0; i < nums.length; i++) { if( nums[i] == 0 ) { nums.splice(i--, 1); zeroCount ++; } } for(let j = 0; j < zeroCount; j++) { nums.push(0) } };
接下来看LeetCode上面的高票答案...
解法3
看了半天的LeetCode答案 大部分的思路都跟第一种类似
然后我在LeetCode中国区翻啊翻啊翻 牛逼的来了
思路:
- 遍历数组,不为0的元素移动数组前方,用index下标记录.
- 遍历结束,对index值后的元素统一设为0
(这里用JAVA的写法特别特别的快)
var moveZeroes = function(nums) { let index = 0; // 注意 这里不能用in 而是要用of for(let num of nums) { if(num!=0){ nums[index++]=num; } } while(index < nums.length) { nums[index++] = 0; } };
相关推荐
zangdaiyang 2020-07-04
aanndd 2020-08-12
aanndd 2020-07-26
aanndd 2020-07-08
yaohustiAC 2020-06-28
us0 2020-06-28
yaohustiAC 2020-06-28
zangdaiyang 2020-06-28
Clairezz 2020-06-28
嗡汤圆 2020-06-26
嗡汤圆 2020-06-21
aanndd 2020-06-16
aanndd 2020-06-16
码墨 2020-06-16
yaohustiAC 2020-06-11
zangdaiyang 2020-06-10
jiayuqicz 2020-06-09
yaohustiAC 2020-06-06
heray0 2020-06-04