移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
法一
解题思路:因为移动零后要保持非零元素的相对顺序。可以利用vector容器把数组中的零全部删掉,每删掉一个就计数一个,最后补上相同位数的零。缺点是非常耗时。
程序:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int count = 0; //用来计数零的个数
vector<int>::iterator it;
for(it = nums.begin();it!=nums.end();)
{
if(*it == 0) //如果是零就删除掉
{
nums.erase(it);
it = nums.begin();
count++;
}
else
it++;
}
for(int j =0;j<count;j++)
nums.push_back(0);
}
法二:双指针法
解题思路:利用双指针如果当前不为零,则让慢指针等于该值并且慢指针加一。最后再利用一个循环将差的位数补零。
程序:
void moveZeroes(vector<int>& nums) {
int i =0; //慢指针
int j; //快指针
int n = nums.size();
for(j=0;j<n;j++)
{
if(nums[j]!=0)
{
nums[i++] = nums[j];
}
}
for(int k =i;k<n;k++) //从i开始而不是i-1是因为在执行上面语句后i会加一,但此时nums[i]并没有赋值
nums[k]=0;
}