热门标签 | 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代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
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社区 版权所有