您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-16 18:17 197 查看
题目要求:

       给出一个数组,要求写一个函数把数组中所有的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的理解。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息