解题思路:
最简单的方法是在给数组赋值的时候忽略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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复