[NOIP2006]明明的随机数

[NOIP2006]明明的随机数

https://ac.nowcoder.com/acm/problem/16669

1、题目大意

明明用计算机生成了N个1到1000之间的随机整数(N ≤ 100),对于其中重复的数字,只保留一个,把其余相同的数去掉。然后再把这些数从小到大排序。请你协助明明完成“去重”与“排序”的工作。

2、思路分析

(1)数组标记。用数组is[i]标记i是否出现过。每读入一个x,观察x是否被is数组标记。若被is数组标记,忽略并进行下次数据的读入;反之读入数据将is[x]赋值为1并记录k的值。最后从1到k遍历a数组输出。

#include <bits/stdc++.h>
using namespace std;
 
int N,a[105],k;
bool is[105];
int main()
{
    scanf("%d",&N);
    for (int i = 1;i <= N;i++){
        int x;
        scanf("%d",&x);
        if (!is[x]) a[++k] = x,is[x] = true;
    }
    sort(a + 1,a + k + 1);
    cout << k << endl;
    for (int i = 1;i <= k;i++) cout << a[i] << " ";
     
    return 0;
}
(2)先对数组进行排序。然后从小到大遍历,若a[i] == a[i - 1]则不输出;反之则输出a[i]。
#include <bits/stdc++.h>
using namespace std;
 
int N,a[105],cnt;
int main()
{
    scanf("%d",&N);
    for (int i = 1;i <= N;i++) scanf("%d",&a[i]);
    cnt = N;
    sort(a + 1,a + N + 1);
    for (int i = 1;i <= N;i++) if (a[i] == a[i - 1]) cnt--;
    cout << cnt << endl;
    for (int i = 1;i <= N;i++) if (a[i] != a[i - 1]) cout << a[i] << " ";
     
    return 0;
}
(3)暴力搜索。对数列进行去重(没有标记的元素和他后面的元素两两比较,相同的则把后一个标记为不要),对去重之后的数组进行排序。

3、感悟

对于去重操作,目前来说比较常用的还是数组标记法,此法是以空间换时间的操作。后续如若还有相关去重策略,会相应在后续博客中总结,敬请期待。

全部评论

相关推荐

本神尊:看来是没招到小红薯上的人
点赞 评论 收藏
分享
龙珠传说:nb,公务员解约不需要支付违约金吧
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务