(Java)[NOIP2006 普及组] 明明的随机数

news2025/7/18 20:51:11

[NOIP2006 普及组] 明明的随机数

    • 一、题目描述
    • 二、输入格式
    • 三、输出格式
    • 四、样例输入
    • 五、样例输出
    • 六、正确代码
      • (1)方法一
      • (2)方法二
      • (3)方法三
    • 七、思路与分析
      • (1)题目分析
      • (2)Set系列集合特点
      • (3)Set集合实现类特点
          • ①HashSet:无序、不重复、无索引。
          • ②LinkedHashSet: **有序**、不重复、无索引。
          • ③TreeSet:**排序**、不重复、无索引
      • (3)实现类:TreeSet
          • ①TreeSet集合概述和特点
          • ②TreeSet集合默认的规则
            • ●对于数值类型:Integer , Double,官方默认按照大小进行升序排序。
            • ●对于字符串类型:默认按照首字符的编号升序排序。
      • (4)Set集合的遍历方式
        • 方式一:迭代器
          • ①迭代器遍历概述
          • ②Collection集合获取迭代器
          • ③Iterator中的常用方法
          • ④总结
        • 方式二:foreach/ 增强for循环
          • ①增强for循环
          • ②格式
          • ③总结
        • 方式三:lambda表达式
          • ①Lambda表达式遍历集合
          • ②Collection结合Lambda遍历的API
      • (5)具体思路

一、题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N N N 1 1 1 1000 1000 1000 之间的随机整数 ( N ≤ 100 ) (N\leq100) (N100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

二、输入格式

输入有两行,第 1 1 1 行为 1 1 1 个正整数,表示所生成的随机数的个数 N N N

2 2 2 行有 N N N 个用空格隔开的正整数,为所产生的随机数。

三、输出格式

输出也是两行,第 1 1 1 行为 1 1 1 个正整数 M M M,表示不相同的随机数的个数。

2 2 2 行为 M M M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

四、样例输入

10
20 40 32 67 40 20 89 300 400 15

五、样例输出

8
15 20 32 40 67 89 300 400

六、正确代码

(1)方法一

import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < n; i++) {
            set.add(a[i]);
        }
        System.out.println(set.size());
        TreeSet T = new TreeSet();
        T.addAll(set);
        Iterator<Integer> it = T.iterator();
        while (it.hasNext()){
            int result = it.next();
            System.out.print(result + " ");
        }
    }
}

(2)方法二

import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        Set<Integer> set = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            set.add(a[i]);
        }
        System.out.println(set.size());
        for (Integer result:set) {
            System.out.print(result + " ");
        }
    }
}

(3)方法三

import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        Set<Integer> set = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            set.add(a[i]);
        }
        System.out.println(set.size());
        set.forEach(s -> {
            System.out.print(s + " ");
        });
    }
}

七、思路与分析

(1)题目分析

读完题目发现本题的考点就是“去重”与“排序”,说到去重,我们就应该想到Set系列集合啦,而排序我们可以利用TreeSet实现。下面我们来看一下set集合的相关知识

(2)Set系列集合特点

●无序:存取顺序不一致
●不重复:可以去除重复,
●无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

(3)Set集合实现类特点

①HashSet:无序、不重复、无索引。

在这里插入图片描述
在这里插入图片描述

②LinkedHashSet: 有序、不重复、无索引。

在这里插入图片描述
在这里插入图片描述

③TreeSet:排序、不重复、无索引

Set集合的功能上基本上与Collection的API一致。

(3)实现类:TreeSet

①TreeSet集合概述和特点

●不重复、无索引、可排序
●可排序:按照元素的大小默认升序(有小到大)排序。
●TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
●注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序。

②TreeSet集合默认的规则
●对于数值类型:Integer , Double,官方默认按照大小进行升序排序。
●对于字符串类型:默认按照首字符的编号升序排序。

在这里插入图片描述
在这里插入图片描述

(4)Set集合的遍历方式

方式一:迭代器

①迭代器遍历概述

●遍历就是一个一个的把容器中的元素访问一遍。
●迭代器在Java中的代表是Iterator, 迭代器是集合的专用遍历方式。

②Collection集合获取迭代器
方法名称说明
Iterator iterator( )返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引
③Iterator中的常用方法
方法名称说明
boolean hasNext()询问当前位置是否有元素存在,存在返回true,不存在返回false
E next()获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界

举例如下:

        Collection<String> lists = new ArrayList<>();
        lists.add("one");
        lists.add("two");
        lists.add("three");
        lists.add("four");
        System.out.println(lists);
        //[one, two, three, four]

        //1.得到当前集合的迭代器对象
        Iterator<String> it = lists.iterator();
        String s = it.next();
        System.out.println(s);//one
        System.out.println(it.next());//two
        System.out.println(it.next());//three
        System.out.println(it.next());//four
        //System.out.println(it.next());//NoSuchElementException 出现无此元素异常的错误
        Collection<String> lists = new ArrayList<>();
        lists.add("one");
        lists.add("two");
        lists.add("three");
        lists.add("four");
        System.out.println(lists);
        //[one, two, three, four]

        //1.得到当前集合的迭代器对象
        Iterator<String> it = lists.iterator();
//        String s = it.next();
//        System.out.println(s);//one
//        System.out.println(it.next());//two
//        System.out.println(it.next());//three
//        System.out.println(it.next());//four
//        //System.out.println(it.next());//NoSuchElementException 出现无此元素异常的错误

        //2.定义while循环
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }

在这里插入图片描述

④总结

1、迭代器的默认位置在哪里。
●Iterator iterator():得到迭代器对象,默认指向当前集合的索引0

2、迭代器如果取元素越界会出现什么问题。
●会出现NoSuchElementException异常。

方式二:foreach/ 增强for循环

①增强for循环

●增强for循环:既可以遍历集合也可以遍历数组。
●它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法。
●实现Iterable接 口的类才可以使用迭代器和增强for, Collection接口已经实现了Iterable接口。

②格式

在这里插入图片描述
在这里插入图片描述

        Collection<String> lists = new ArrayList<>();
        lists.add("one");
        lists.add("two");
        lists.add("three");
        lists.add("four");
        System.out.println(lists);
        //[one, two, three, four]

        //遍历集合
        for (String s : lists) {
            System.out.println(s);
        }

        System.out.println("-----------------------");
        //遍历数组
        double[] scores = {59.5,60,99,88};
        for (double score : scores) {
            System.out.println(score);
        }

在这里插入图片描述
注意:修改变量的值时,数组的内容不会改变

        //遍历数组
        double[] scores = {59.5,60,99,88};
        System.out.println(Arrays.toString(scores));
        for (double score : scores) {
            System.out.println(score);
            if (score == 60){
                score = 66;//修改无意义,不会影响数组的元素值
            }
        }
        System.out.println(Arrays.toString(scores));

在这里插入图片描述

③总结

1、 增强for可以遍历哪些容器?
●既可以遍历集合也可以遍历数组。

2、增强for的关键是记住它的遍历格式

方式三:lambda表达式

①Lambda表达式遍历集合

●得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。

②Collection结合Lambda遍历的API
方法名称说明
default void forEach(Consumer<? super T> action):结合lambda遍历集合

在这里插入图片描述

        Collection<String> lists = new ArrayList<>();
        lists.add("one");
        lists.add("two");
        lists.add("three");
        lists.add("four");
        System.out.println(lists);
        //[one, two, three, four]

//        lists.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }

        //化简
//        lists.forEach(s ->  {
//                System.out.println(s);
//        });

        //再化简
//        lists.forEach(s -> System.out.println(s));

        //继续化简
        lists.forEach(System.out::println);

(5)具体思路

首先先将随机数的个数以及所有的随机数读入并存储

随机数可利用for循环存储到一个数组中

Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }

然后就到了利用TreeSet集合去重和排序的时候啦~
我们将利用TreeSet*排序**、不重复、无索引的特点,实现去重和排序的作用

创建一个TreeSet集合,然后调用Set集合的add方法将数组中的数字添加到集合中,添加完成后,TreeSet集合本身就完成了去重和排序的操作,超级省心!

Set<Integer> set = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            set.add(a[i]);
        }

调用Set集合的方法获取集合中的元素个数并打印出来

System.out.println(set.size());

最后就只剩下将TreeSet集合中的元素输出啦,但由于Set集合没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。可以遍历Set集合的方法如下:

方法一:利用迭代器遍历

Iterator<Integer> it = set.iterator();
        while (it.hasNext()){
            int result = it.next();
            System.out.print(result + " ");
        }

方法二:foreach/ 增强for循环

for (Integer result:set) {
            System.out.print(result + " ");
        }

方法三:lambda表达式

set.forEach(s -> {
            System.out.print(s + " ");
        });

结束了!恭喜你掌握了该题~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql基于Amoeba(变形虫)实现读写分离

一&#xff0c;Amoeba介绍 1、什么是amoeba&#xff1f; ​ Amoeba(变形虫)项目&#xff0c;专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据…

【数据结构】顺序表与线性表之ArrayList

目录 一、顺序表与线性表的概念 1、顺序表 2、线性表 二、Java里的集合类之ArrayList 1、ArrayList与顺序表 2、认识ArrayList 1.构造方法 2.常用方法 3.遍历ArrayList的几个方法 4.扩容机制 三、模拟实现ArrayList 1、字段 2、构造方法 3、常用方法 1.判满 2.判…

10.1、Django入门

文章目录预备知识MVC模式和MTV模式MVC模式MTV 模式Django框架Django框架简介Django框架的应用启动后台admin站点管理数据库迁移创建管理员用户管理界面本地化创建并使用一个应用bookapp预备知识 HTTP协议就是客户端和 服务器端之间数据传输的格式规范&#xff0c;格式简称为“…

教你搭建FTP文件共享服务器

一、什么是FTP FTP—文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一套标准协议&#xff0c;它工作在 OSI 模型的第七层&#xff0c; TCP 模型的第四层&#xff0c; 即应用层&#xff0c; 客户在和服务器建立连接前…

BCN基团TAMRA-BCN-PEG4-endo,endo-BCN-PEG4

中文名&#xff1a;endo-BCN-四聚乙二醇-四甲基罗丹明 英文名&#xff1a;endo-BCN-PEG4-TAMRA&#xff0c;TAMRA-BCN-PEG4-endo CAS号&#xff1a;N/A 化学式&#xff1a;C46H56N4O10 分子量&#xff1a;824.97 产品描述&#xff1a; TAMRA-BCN-PEG4-endo包含 TARMA 染料和 …

分布式系统(数据复制与一致性)

文章目录ReplicationCAP ConjectureData-centric Consistency ModelsSequential ConsistencyCausal ConsistencyEntry ConsistencyEventual ConsistencyClient-centric Consistency ModelsMonotonic Read ConsistencyMonotonic Writes ConsistencyRead Your Writes Consistency…

Python学习基础笔记五十三——单继承

1、派生属性&#xff1a; 当然子类也可以添加自己的新的属性或者在这里重新定义这些属性&#xff08;不会影响到父类&#xff09;&#xff0c;需要注意的是&#xff0c;一旦重新定义了自己的属性且与父类重名&#xff0c;那么调用新增的属性&#xff0c;就以自己为准了。 例1…

在Windows中使用Nginx配置部署springboot+vue项目

Nginx 链接&#xff1a;https://pan.baidu.com/s/1c-9JJ3e63rNNeSRuEFh0Ow?pwdaamb 提取码&#xff1a;aamb 配置 解压后进入到 conf 目录下&#xff0c;修改 nginx.conf 文件&#xff0c;将下面的内容直接复制粘贴进去即可。 events {worker_connections 1024; ## Defa…

分享即时通讯音视频开发编码标准

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 视频通讯过程是视频和音频的实时双向完整通讯过程。在…

java学习day62(乐友商城)商品规格设计与商品查询的页面实现

1.商品规格数据结构 乐优商城是一个全品类的电商网站&#xff0c;因此商品的种类繁多&#xff0c;每一件商品&#xff0c;其属性又有差别。为了更准确描述商品及细分差别&#xff0c;抽象出两个概念&#xff1a;SPU和SKU&#xff0c;了解一下&#xff1a; 1.1.SPU和SKU SPU&…

恒温恒湿实验室(房)建设、设计SICOLAB

通用实验室是指适用于多学科的以实验台规模进行经常性科学研究和实验工作的实验室&#xff0c;其夏季空气调节室内计算参数为温度 26&#xff5e;28℃&#xff0c;相对湿度小于 65%&#xff0c;在规范中没有对温湿度控制精度及洁净度做相关要求。专用实验室是指有特定环境要求&…

C++基础学习三

目录儿六、分支语句和逻辑操作符6.1 if语句6.1.1 if6.1.2 if-else6.1.3 if-else if-else6.2 逻辑表达式6.2.1 逻辑或||6.2.2 逻辑与&&6.2.3 逻辑非!6.2.4 逻辑操作符的其他表示方式6.3 字符函数库cctype6.4 三目/元操作符6.5 switch语句6.5.1 switch引入枚举常量6.6 br…

【OpenCall】ICASSP2023通用会议理解及生成挑战赛邀请函

ICASSP2023 通用会议理解及生成挑战赛(General Meeting Understanding and Generation Challenge,缩写为 MUG)是ICASSP2023 系列大挑战(SPGC)之一&#xff0c;由魔搭ModelScope社区、阿里巴巴达摩院语音实验室&语言技术实验室&#xff0c;阿里云天池联合浙江大学数字媒体计…

Linux基本搭建和操作

Linux基本搭建和操作1、创建三台虚拟机2、创建使用SSH远程连接3、实现IP地址与主机名的映射4、关闭和禁用防火墙5、创建目录结构6、压缩打包7、安装软件包安装jdk安装mysql8、创建脚本文件9、运行脚本文件10、免密登录配置11、远程拷贝文件1、创建三台虚拟机 序号虚拟机名称静…

高效技巧-打表法

打表法 打表是一种典型的用空间换时间的技巧 一般指将所有可能需要用到的结果事先计算出来&#xff0c;这样后面需要用到时就可以直接查表获得。 打表常见的用法有如下几种: ①在程序中一次性计算出所有需要用到的结果&#xff0c;之后的查询直接取这些结果这个是最常用到的…

开源之路——如何发布属于自己的npm包

开源之路——如何发布属于自己的npm包1、前言2、起步2.1、初始化项目2.2、安装webpack相关依赖2.3、添加入口文件和封装方法2.4、设置源2.5、添加用户2.6、发布3、使用1、前言 在进行开发的过程当中&#xff0c;难免会出现一些重复性的工作&#xff0c;例如说我们要对一个数组…

电脑如何格式化重装系统

​众所周知&#xff0c;默认情况下&#xff0c;计算机重新安装系统将设置格式化磁盘。如果您选择其他需要格式化的硬盘&#xff0c;您必须如何操作&#xff1f;一般来说&#xff0c;我们是pe手动格式磁盘可以避免立即格式化硬盘造成的一些问题。让我们谈谈如何格式化硬盘重做系…

【软件测试】测试的天花板?资深测试怎么一路爬的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试职业的天花板是…

脑图谱的验证方法

方法 目的 与其他分割比较区域内的同质性 比较不同分割的平均区域内同质性 有约束的几何扰动比较 验证分割区域内部的功能同质性 留一交叉验证 验证相似矩阵的稳定性 剪影宽度silhouette width (SI) 计算簇内和簇外的功能信号相似性差异 骰子系数dice coefficient 衡…

G1D36-import-keras.save_model-code-沐沐的调参课

1、python导入函数 https://zhuanlan.zhihu.com/p/64893308 服了 https://blog.csdn.net/weixin_45195364/article/details/119857246?spm1001.2101.3001.6650.6&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-1198572…