热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第三次CCF计算机软件能力认证题目一:图书馆读者访问记录

2019独角兽企业重金招聘Python工程师标准问题【问题描述】小明最近当上了图书馆管理员,请帮助小明实现这样一个程序:小明按先后顺序输入一串访问

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

问题

【问题描述】

小明最近当上了图书馆管理员,请帮助小明实现这样一个程序:小明按先后顺序输入一串访问图书馆的读者编号序列,程序输出该读者当前第几次访问图书馆。

【输入格式】

第一行输入正整数N,表示接下来有N个读者访问记录。

第二行输入N个访问记录的读者编号(正整数),用空格隔开。

【输出格式】

输出一行,表示读者是第几次访问图书馆,用空格隔开。

【输入样例】

5

1 2 1 3 1

【输出样例】

1 1 2 1 3 


分析

这题是本次考试的第一题,难度不大,热下身。看了输入样例、输出样例后,不难发现,程序需要求出的是某个数字当前出现过的次数。

法一

可以考虑用一个嵌套循环解决:

设数组为data[N]

  1. 从data中位置 i &#xff08;0<&#61;i

  2. 从数组的位置0处开始到 i&#xff0c;对每一个 j (0<&#61;j<&#61;i)若有data[j] &#61;&#61; data[i]&#xff0c;则count&#43;&#43;.

  循环代码&#xff1a;

for(int i &#61; 0; i < N; i&#43;&#43;){int count &#61; 0; //记数器for(int j &#61; 0; j <&#61; i; j&#43;&#43;){if(data[i] &#61;&#61; data[j]){count&#43;&#43;;}}result &#43;&#61; count &#43; " ";
}

问题解决。


法二

可是&#xff0c;如果数据量比较大&#xff0c;用嵌套循环的效率似乎不是很好。

第二种方法可以只使用一个循环解决&#xff0c;牺牲空间换取时间。O(n).

这种方法需要引入LinkedList&#xff0c;HashMap这些java.util包下的数据结构&#xff08;看了一下CCF CSP考试说明&#xff0c;应试者的数据结构、分支语句、循环语句等等基本功是其主要考查的目的之一&#xff09;。LinkedList用来存储读者的编号&#xff0c;而HashMap则以编号为键&#xff08;Key&#xff09;&#xff0c;以读者访问次数&#xff08;数字出现次数&#xff09;为值&#xff08;Value&#xff09;&#xff0c;将这些重要存储起来。

思路大致如此&#xff1a;

  1. 在LinkedList中取出读者编号id

  2. 判断HashMap中是否有id做键&#xff0c;若有则将次数&#43;1覆盖回HashMap&#xff0c;无则将id作为键&#xff0c;1作为值 put到HashMap里

String result &#61; "";
//引入一个Map来存储数字出现的次数&#xff0c;Key为读者编号&#xff0c;Value为访问的次数
Map map &#61; new HashMap();for(int i &#61; 0; i < data.size(); i&#43;&#43;){int id &#61; data.get(i);     //得到一个读者的编号Integer count &#61; map.get(id);    //从map中读取次数if(count &#61;&#61; null){ //若读取到的为null&#xff0c;则说明之前没有访问过result &#43;&#61; 1 &#43; " ";map.put(id, 1); //往map中添加put的次数}else{ //若之前有访问过count&#43;&#43;; //访问次数&#43;1map.put(id, count); //将&#43;1后的数据覆盖原来的访问次数result &#43;&#61; count &#43; " ";}
}


代码

以下为完整代码&#xff1a;

法一

import java.util.Scanner;public class Main {public static void main(String[] args) {new Main().run();}public void run(){//读取小明输入的记录个数&#xff0c;并创建相应大小的数组Scanner scanner &#61; new Scanner(System.in);final int N &#61; scanner.nextInt();//创建记录数组int[] data &#61; new int[N];//读取N次访问记录for(int i &#61; 0; i < N; i&#43;&#43;){data[i] &#61; scanner.nextInt();}//处理String result &#61; "";for(int i &#61; 0; i < N; i&#43;&#43;){int count &#61; 0; //记数器for(int j &#61; 0; j <&#61; i; j&#43;&#43;){if(data[i] &#61;&#61; data[j]){count&#43;&#43;;}}result &#43;&#61; count &#43; " ";} System.out.println(result); //输出结果}
}


法二

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;public class Main {public static void main(String[] args) {new Main().run();}public void run(){//读取小明输入的记录个数&#xff0c;并创建相应大小的数组Scanner scanner &#61; new Scanner(System.in);final int N &#61; scanner.nextInt();//创建记录数据的ListLinkedList data &#61; new LinkedList();//读取N次访问记录for(int i &#61; 0; i < N; i&#43;&#43;){data.add(scanner.nextInt());}String result &#61; "";//引入一个Map来存储数字出现的次数&#xff0c;Key为读者编号&#xff0c;Value为访问的次数Map map &#61; new HashMap();for(int i &#61; 0; i < data.size(); i&#43;&#43;){int id &#61; data.get(i); //得到一个读者的编号Integer count &#61; map.get(id); //从map中读取次数if(count &#61;&#61; null){ //若读取到的为null&#xff0c;则说明之前没有访问过result &#43;&#61; 1 &#43; " ";map.put(id, 1); //往map中添加put的次数}else{ //若之前有访问过count&#43;&#43;; //访问次数&#43;1map.put(id, count); //将&#43;1后的数据覆盖原来的访问次数result &#43;&#61; count &#43; " ";}}System.out.println(result); //输出结果}
}

&#xff08;以上两份代码&#xff0c;为了更容易看懂&#xff0c;一些还可以更精简的地方没有精简&#xff1b;如数据的读取。&#xff09;


From&#xff1a;陈祖煌

Blog&#xff1a;http://my.oschina.net/chenzuhuang/blog

转载必须说明出处

----------------------------------------------------------------------------------------------------------


转:https://my.oschina.net/chenzuhuang/blog/356509



推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
author-avatar
gaoxing332844731
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有