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

问题

【问题描述】

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

【输入格式】

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

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

【输出格式】

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

【输入样例】

5

1 2 1 3 1

【输出样例】

1 1 2 1 3

分析

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

法一

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

设数组为data[N]

从data中位置 i (0

从数组的位置0处开始到 i,对每一个 j (0

循环代码:

for(int i = 0; i 

int count = 0;//记数器

for(int j = 0; j 

if(data[i] == data[j]){

count++;

}

}

result += count + ” “;

}

问题解决。

法二

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

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

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

思路大致如此:

在LinkedList中取出读者编 id

判断HashMap中是否有id做键,若有则将次数+1覆盖回HashMap,无则将id作为键,1作为值 put到HashMap里

String result = “”;

//引入一个Map来存储数字出现的次数,Key为读者编 ,Value为访问的次数

Map map = new HashMap();

for(int i = 0; i 

int id = data.get(i);    //得到一个读者的编

Integer count = map.get(id);    //从map中读取次数

if(count == null){//若读取到的为null,则说明之前没有访问过

result += 1 + ” “;

map.put(id, 1);//往map中添加put的次数

}

else{//若之前有访问过

count++;//访问次数+1

map.put(id, count);//将+1后的数据覆盖原来的访问次数

result += count + ” “;

}

}

代码

以下为完整代码:

法一

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

new Main().run();

}

public void run(){

//读取小明输入的记录个数,并创建相应大小的数组

Scanner scanner = new Scanner(System.in);

final int N = scanner.nextInt();

//创建记录数组

int[] data = new int[N];

//读取N次访问记录

for(int i = 0; i 

data[i] = scanner.nextInt();

}

//处理

String result = “”;

for(int i = 0; i 

int count = 0;//记数器

for(int j = 0; j 

if(data[i] == data[j]){

count++;

}

}

result += count + ” “;

}

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(){

//读取小明输入的记录个数,并创建相应大小的数组

Scanner scanner = new Scanner(System.in);

final int N = scanner.nextInt();

//创建记录数据的List

LinkedList data = new LinkedList();

//读取N次访问记录

for(int i = 0; i 

data.add(scanner.nextInt());

}

String result = “”;

//引入一个Map来存储数字出现的次数,Key为读者编 ,Value为访问的次数

Map map = new HashMap();

for(int i = 0; i 

int id = data.get(i);//得到一个读者的编

Integer count = map.get(id);//从map中读取次数

if(count == null){//若读取到的为null,则说明之前没有访问过

result += 1 + ” “;

map.put(id, 1);//往map中添加put的次数

}

else{//若之前有访问过

count++;//访问次数+1

map.put(id, count);//将+1后的数据覆盖原来的访问次数

result += count + ” “;

}

}

System.out.println(result);//输出结果

}

}

(以上两份代码,为了更容易看懂,一些还可以更精简的地方没有精简;如数据的读取。)

From:陈祖煌

———————————————————————————————————-

相关资源:LibraryO:图图书馆软件。-开源_图书馆开源项目-其它代码类资源…

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月5日
下一篇 2021年6月5日

相关推荐