目录javascript
给定一个数组 nums,编写一个函数将全部 0 移动到数组的末尾,同时保持非零元素的相对顺序。前端
示例:java
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
说明:git
283. 移动零github
这个问题属于 “数组变换” 的一个普遍范畴。这一类是技术面试的重点。主要是由于数组是如此简单和易于使用的数据结构。遍历或表示不须要任何样板代码,并且大多数代码将看起来像伪代码自己。[[1]]面试
问题的要求很简单,将全部0移动到数组末尾且非0元素必须保持其原始顺序算法
双指针,暴力法数组
有意思的是,正常设计的算法,在遇到[0,0,0,0,1],[1,0,0,0,0,1]
这两种数组的时候都比较尴尬,没办法有效的减小操做次数,这两个需求是相互排斥的,可是咱们能够尽量的在其中找到平衡数据结构
暴力法使用一个额外的数组
,先将全部非0元素按照原顺序push到数组里同时用count
统计0出现的次数,而后在额外的数组
里再pushcount
个0,按照题目的要求咱们须要在原来的数组上改动,因此再依次将数组元素填入原数组函数
前一种方法有一些额外的操做.例如,全部(除最后一个)前导零的数组:[0,0,0,1]
就会对数组进行许多没必要要的操做,若是只固定非0元素的话,能够只交换一次
/** * @param {number[]} nums * @return {void} Do not return anything, modify nums in-place instead. */ var moveZeroes = function (nums) { // 双指针法 for (let [i, j] = [0, 0]; i < nums.length; i++) { if (nums[i] !== 0) { [nums[j], nums[i]] = [nums[i], nums[j]] j++ } } // 暴力法 // let count = 0 // 统计0的个数 // const res = [] // 返回的数组 // nums.forEach(el => el === 0 ? count++ : res.push(el)) // for (let i = 0; i < count; i++) { // res.push(0) // } // for (let i = 0; i < nums.length; i++) { // nums[i] = res[i] // } }
[0,1,0,3,12]
的运行结果[1,3,12,0,0]
执行用时 :68 ms, 在全部 javascript 提交中击败了95.54%的用户 内存消耗 :37.2 MB, 在全部 javascript 提交中击败了5.10%的用户
350. 两个数组的交集 II [1]:https://leetcode-cn.com/problems/move-zeroes/solution/yi-dong-ling-by-leetcode/