Hint1
本题中的数据范围有什么特点?
Hint2
能否不用排序算法和去重算法写出?
Solution
观察本题,可以发现 的范围最大只有 ,这个范围比较小,因此可以创建一个长度为 的数组 st。对于每个 ,我们可以进行标记。具体来说,可以将 st[] 置为 1,表示 在数组中出现过。如果 出现多次,仍然只需标记一次,保证 st[] = 1。通过判断 st[] 是 0 还是 1,就可以确定 是否在数组中出现过。这便解决了去重的问题。
对于排序的问题,我们可以发现,数组下标本身就是有序的,例如,st[1],st[2]...st[]。因此,我们可以从小到大遍历 的范围,从0到。如果 st[] 为 1,表示该值出现过,则输出该值;否则,不输出。这样既保证了输出的元素不重复,又保证了它们是有序的。
当然,这道题也可以通过排序算法和去重算法来解决。请自行在网上学习排序算法和去重算法的原理。在 C++ 语言中,可以直接调用标准库函数来解决这个问题,这也体现了 C++ 相对于 C 语言的优势。
C语言代码(不用排序+去重算法版本)
#include<stdio.h>
#include<stdlib.h>
int st[1000010],n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int t;
scanf("%d",&t);
st[t]=1;//对于出现过的数标记,这一步解决了去重的问题
}
for(int i=0;i<=1000000;i++){//从小到大遍历,解决了排序的问题
if(st[i]==1){
printf("%d ",i);
}
}
printf("\n");
}
C++代码(排序+去重算法版本)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
typedef pair<int,int> PII;
void solve(){
int n;
cin>>n;
vector<int>a(n);
for(int i=0;i<n;i++)cin>>a[i];
sort(a.begin(),a.end());//排序
a.erase(unique(a.begin(),a.end()),a.end());//去重
for(auto i : a)cout<<i<<" ";
}
signed main(){
int t=1;ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
// cin>>t;
while(t--)solve();
return 0;
}