解题思路:
最简单的方法是在给数组赋值的时候忽略0,或者在打印输出的时候忽略0,但是这样就和题目意思不符了。
对于一个数组的元素删除是很麻烦的,删除一个数以后需要将后面的元素向前补齐,实现麻烦。
在c++ 的stl里面提供了动态数组vector ,提供了数组的删除方法。
vector是标准库中常见的一种容器,使用起来非常方便,可以用来代替c++原本的数组。
需要使用头文件#include <vector>
常见的操作有:
vector<int>p;//创建动态数组p
p.push_back(k);//依次在p中放入值
p.size()获取数组的长度
使用[]访问获取数组内的值
对于动态数组的删除是使用.erase()方法,例如:
for(vector<int>::iterator it=p.begin();it<p.end();){//使用迭代器访问数组内元素 if(*it==0)p.erase(it);//如果数组内元素等于0,就删除这个元素 }
但是这样对于1 0 2 0 3这种形式是可行的,但是对于1 0 0 2 0这种形式,数组内的元素最终是1 0 2,有一个0被没有被清除掉。
原因是迭代器失效:在第一个0被erase掉的时候,it迭代器已经失效了,用它来继续遍历vector就会漏掉被删除元素后面的第一个元素,导致0没有被完全清除。
因为erase函数的返回值是指向当前被删除元素的下一个元素的迭代器,所以我们可以通过将这个返回值赋给it进行解决。
for(vector<int>::iterator it=p.begin();it<p.end();){ if(*it==0)it=p.erase(it);//删除it以后将返回值(被删除元素的下一个元素的迭代器)赋值给it else it++;//没有删除元素,正常向下+1寻找 }
参考代码:
#include <bits/stdc++.h> #define ll long long using namespace std; int main() { vector<int>p; ll i,n,k=0,z=0; cin>>n; for(i=0;i<n;i++){ cin>>k; p.push_back(k); } for(vector<int>::iterator it=p.begin();it<p.end();){ if(*it==0)it=p.erase(it); else it++; } cout<<p.size()<<endl; for(vector<int>::iterator it=p.begin();it<p.end();it++){ cout<<*it<<" "; } return 0; }
0.0分
156 人评分
C语言考试练习题_保留字母 (C语言代码)浏览:616 |
Lucky Word (C++代码)浏览:1004 |
点我有惊喜!你懂得!浏览:1009 |
C语言训练-邮票组合问题* (C语言代码)......浏览:689 |
简单的a+b (C++语言代码)浏览:895 |
兰顿蚂蚁 (C++代码)浏览:1163 |
WU-链表数据求和操作 (C++代码)浏览:1385 |
哥德巴赫曾猜测 (C语言代码)浏览:2575 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:609 |
The 3n + 1 problem (C语言代码)浏览:603 |