题目大意
给一个长度为 $n$ 的数组,求其不重复的第 $k$ 小数。
数据范围
$1≤k≤n≤1000$
数组中元素取值范围: $[1,10000]$
思路
可以用去重和给数组排序跳过重复的数字这两种方法实现。
代码1
$bool$ 数组去重
#include<bits/stdc++.h>
using namespace std;
int n,k;
bool had[11111];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
had[a]=1;
}
cin>>k;
int cnt=0;
for(int i=1;i<=10000;i++)
{
if(had[i]==1)cnt++;
if(cnt==k)
{
cout<<i;
break;
}
}
return 0;
}
代码2
“大炮打蚊子”—— $map$(当然还有其他的大炮)去重。
#include<bits/stdc++.h>
using namespace std;
int n,k;
map<int,int> had;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
had[a]=1;
}
cin>>k;
int cnt=0;
for(int i=1;i<=10000;i++)
{
if(had[i]==1)cnt++;
if(cnt==k)
{
cout<<i;
break;
}
}
return 0;
}
代码3
排序后跳过重复数字
#include<bits/stdc++.h>
using namespace std;
int n,k,a[11111];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>k;
sort(a+1,a+1+n);
int cnt=1;
for(int i=2;i<=n;i++)
{
if(a[i]!=a[i-1])cnt++;
if(cnt==k)
{
cout<<a[i];
break;
}
}
return 0;
}
总结
很简单的题目,但如果理解错题意(比如说误解为不去重)就会错。
题目可能还有其他方法,有兴趣的读者可以自己探索。
如果有什么问题,欢迎在评论区中指出。