【LeetCode-283】Move Zeroes(C++)

题目要求:

       给出一个数组,要求写一个函数把数组中所有的0全部挪到数组的最后面,同时保持数组中非0元素的顺序不变。比如给出一个数组nums=[0,1,0,3,12]。调用函数之后nums变为[1,3,12,0,0]。

       注意:要在原数组上完成元素的移动,不能进行数组的复制。使总的操作次数最小。

解题思路:

       首先要遍历一次数组,用一个vector容器记录下元素为0的位置。然后用两个for循环完成对0元素的删除和移动。最后在用一个for循环把数组后n位置0(其中n为0元素的个数)

程序实现:

class Solution{
public:
  void moveZeroes(vector<int>& nums){
   vector<int>position;
   for(int i=0;i<nums.size();i++){
    if(nums[i]==0)
     position.push_back(i);
   }//将所有0元素的位置存储在position里面
   if(position.size()!=0){//如果数组中不含0元素,则什么都不做。
   int n=position.size()-1;
   int g=nums.size()-1;
   
   for(int i=n;i>=0;i--){
    for(int j=position[i];j<g;j++){
     nums[j]=nums[j+1];
    }
   }//覆盖0元素。
   for(int i=nums.size()-position.size();i<nums.size();i++){
    nums[i]=0;
   }//将数组后nums.size()-position.size()位置0
   }
  }
};

总结:

       一开始提交的时候显示runtime error 一直找不到问题,后来搜了一下说runtime error 很可能是内存错误。然后检查了一下发现忽略了数组中不含0元素的情况。如果数组中不含0元素,那么position.size()应该为0,访问position[positon.size()-1]的时候自然会出现内存错误。
       感觉这个题目并没有让我学到什么东西,只不过是简单的位置移动,不过加强了对vector的理解。

 

你可能感兴趣的:(C++,vector,move,zeroes,leatcode)