题目描述
283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
解答1:
个人思路:
从尾到头,依次判断,元素是否为 0 ,如果是,并且右边也有不为 0 元素,则该元素与右边元素交换位置,i 移到交换后的位置。
164 ms
/** * @param {number[]} nums * @return {void} Do not return anything, modify nums in-place instead. */ var moveZeroes = function(nums) { for(let i = nums.length; i>=0; i--){ if (nums[i]===0 && nums[i+1] && nums[i+1]!==0){ [nums[i],nums[i+1]] = [nums[i+1],nums[i]] i+=2 } } };
解答2:
已有的最快的解答:56ms
两个指针,一个start指向0,一个end指向length-1;
循环,start小于end的时候,如果start这个index的元素是 0 ,则将这个元素删掉,尾巴上push进一个 0 ,end左移(end--);
如果start这个index的元素不是 0,start++,继续判断……
const moveZeroes = nums => { const max = nums.length let start = 0 let end = max - 1 while (start < end) { const item = nums[start] if (item === 0) { nums.splice(start, 1) nums.push(0) end-- continue } start++ } return nums }
解答3:
用for循环实现类似解答2的思路。96ms
Ps:最早我的解答里,for循环里使用的条件是 i<nums.length,这样会导致多循环后面好多个无用的0,导致超时,引入动态的end即可解决此问题。
var moveZeroes = function(nums) { let end = nums.length for(let i = 0; i<end; i++){ if(nums[i]===0){ nums.splice(i,1) nums.push(0) i-- end-- } } };
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!