STL中unique原理实现 及示例
vector<int>::iterator unique(vector<int>& a)
{
int t = 0;
for(int i=0; i<a.size(); i++)
if(!i || a[i]!=a[i-1])
a[t++] = a[i];
return a.begin()+t;
}
int main()
{
...
a.erase(unique(a),a.end());
...
}
去重后,数组会有如下特点:
除了首位元素,其余元素和各自的前一位不相等
因此,我们只需要把满足这个特点的所有数依次排列即可,最终返回的地址为这些数中最后一个数之后的地址,再把后面的元素删除即可
恰好碰见一道练习题可以用到
链接: 凌波微步 (nowcoder.com)
来源:牛客网
题目描述
小Z的体型实在是太胖了,每次和小D一起出门都跟不上小D的脚步,这让小Z很气馁,于是小Z跋山涉水,仿名山,遍古迹,终于找到了逍遥派。掌门看小Z求师虔诚,决定传小Z一套《凌波微步》。
这种腿法可以无视距离的行进,但缺点是只能走向高处,否则强行发功极易走火入魔。
一天,练习《林波微步》的小Z来到一处练武场,这里从左到右,共有n个木桩,这些木桩有高有低,在这里小Z勤奋的练习着凌波微步,你知道小Z在这处练武场最多能练习多少次么?
输入描述:
本题有T组数据。 对于每组数据第一行有一个正整数n表示有多少个木桩。 第二行有n个数 a_i,表示木桩与水平地面的相对高度。 1≤T≤10 1≤n≤100000 1≤a_i≤1000000000
输出描述:
输出结果,并换行。
示例1
输入
2 6 1 2 3 4 5 6 5 1 3 5 3 6
输出
6 4
说明
第一组: 1->2->3->4->5->6 共6步 第二组: 1->3->5->6 共4步
思路:
重复的高度不会跳第二次, 该题仅要求我们输出跳的次数(若是需要输出路线的话可能会用到哈希或者背包),我们只需要得出集合中各自相异的元素个数即可
正好顺便用一下刚学到的unique函数
注意:
去重前记得先排好序,因为我们的unique函数默认元素是一个呈单调 增/减 的序列
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>::iterator unique(vector<int>& a)
{
int t = 0;
for(int i=0; i<a.size(); i++)
if(!i || a[i]!=a[i-1])
a[t++] = a[i];
return a.begin()+t;
}
int main()
{
int t,n,x;
cin >> t;
while(t--)
{
cin >> n;
vector<int> a;
for(int i=0; i<n; i++){
cin >> x;
a.push_back(x);
}
sort(a.begin(),a.end());//★
a.erase(unique(a),a.end());//去重
// for(auto item : a) cout<<item<<' ';
// cout<<endl;
cout << a.size() << endl;
}
return 0;
}
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799107.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY