[LeetCode]283. Move Zeroes
283. Move Zeroes
Easy
Given an array nums
, write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
Example:
Input:[0,1,0,3,12]
Output:[1,3,12,0,0]
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
题目大意:给定一个数组,在不改变数组中数字排序的情况下,将数组中所有的0都移动到数组的尾部
注意:1.不能使用新的数组 2.尽可能少的对数组进行修改
思路:
方法一:
遍历数组,记录数组中0的个数,并将数组中的0删除掉,最后在数组尾部插入相应数量的0.这么做的缺点是,对于有的语言,没有对数组操作的函数的话,很难实现,并且时间复杂度较高。
代码如下:
JavaScript:
/*JavaScript*/ var moveZeroes = function(nums) { let zero_num=0; for(let i=0;i<nums.length;++i){ if(nums[i]===0){ zero_num++; nums.splice(i,1); i--; } } while(zero_num--){ nums.push(0); } return nums; };
方法二:
维护一个游标zero_start,指示数组中0开始的地方,遍历数组,遇到非0数组就将那个数字放到zero_start指示的地方,然后将zero_start向前移动1.
增加边界判断,数组大小为小于等于1,就直接返回数组本身。
代码如下:
JavaScript:
/*JavaScript*/ var moveZeroes = function(nums) { if(nums.length<=1)return nums; let zero_start=-1; for(let i=0;i<nums.length;++i){ if(nums[i]==0 && zero_start==-1){ zero_start=i; } else if(nums[i]!=0 && zero_start!=-1){ nums[zero_start]=nums[i]; nums[i]=0; zero_start++; } } return nums; };
C++:
/*C++*/ class Solution { public: void moveZeroes(vector<int>& nums) { if(nums.size()<=1)return; int zero_start=-1, len=nums.size(); for(int i=0;i<len;++i){ if(nums[i]==0 && zero_start==-1){ zero_start=i; } if(nums[i]!=0 && zero_start!=-1){ nums[zero_start]=nums[i]; nums[i]=0; zero_start++; } } } }; /**代码优化下*/ class Solution { public: void moveZeroes(vector<int>& nums) { if(nums.size()<=1)return; for(int i=0,j=0;i<nums.size();++i){ if(nums[i]){ swap(nums[i],nums[j++]); } } } };
Python:
#Python3 class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ j=0; for i in range(len(nums)): if(nums[i]): nums[i],nums[j]=nums[j],nums[i] j=j+1