题目描述
给定一个大小为n的整型数组a,你需要对其按照升序排序并进行去重。
输入
第一行:一个整数n。(1≤n≤2×10^5)
第二行:n个整数,表示数组a的所有元素。(−10^9≤ai≤10^9,1≤i≤n)
输出
共一行,输出升序排序且去重后的数组a。
样例输入
8
2 0 2 3 0 7 1 7
样例输出
0 1 2 3 7
思路,使用sort()完成从小到大的排序,
去重可以用unique函数和erase函数配合
unique的作用是“去掉”容器中相邻元素的重复元素,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址
erase的作用是删除元素,erase(first,last)表示删除从first到last之间的字符(first和last都是迭代器),所以这一段的作用就是从去重之后的尾地址开始到最后一个元素的位置,将重复的元素全部删除。C++中erase的用法_erase的用法 c++-优快云博客
a.erase(unique(a.begin(),a.end()),a.end()); //从a中删除重复的元素
关于for循环:
for(int i=0;i<a.size();i++) //输出数组内元素
{
cout<<a[i]<<' ';
}
上面这段代码与下面的是一样的作用
范围(range-based)for 循环是 C++11 标准引入的特性,如果要使用,将编译器改为C++11即可,具体见Dev C++ [Error] range-based 'for' loops are not allowed in C++98 mode-优快云博客
for(auto &i : a) //使用范围(range-based)for 循环遍历向量 "a" 中的元素,将每个元素赋值给变量 "i"
{
cout<<i<<' ';
}
这是一种更简洁的for循环。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> a; //定义整数数组
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
a.push_back(x); //将输入的数字添加到a数组末尾
}
sort(a.begin(),a.end()); //按从小到大顺序排序
a.erase(unique(a.begin(),a.end()),a.end()); //从a中删除重复的元素
for(auto &i : a) //使用范围(range-based)for 循环遍历向量 "a" 中的元素,将每个元素赋值给变量 "i"
{
cout<<i<<' ';
}
return 0;
}
或者这样写:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> a; //定义整数数组
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
a.push_back(x); //将输入的数字添加到a数组末尾
}
sort(a.begin(),a.end()); //按从小到大顺序排序
a.erase(unique(a.begin(),a.end()),a.end()); //从a中删除重复的元素
for(int i=0;i<a.size();i++) //使用范围(range-based)for 循环遍历向量 "a" 中的元素,将每个元素赋值给变量 "i"
{
cout<<a[i]<<' ';
}
return 0;
}