欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python入门习题(12)——CCF CSP认证考试真题:门禁系统

程序员文章站 2022-04-02 09:30:30
...

问题描述

试题编号: 201412-1
试题名称: 门禁系统
时间限制: 1.0s
内存限制: 256.0MB

问题描述
  涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。
输入格式
  输入的第一行包含一个整数n,表示涛涛的记录条数。
  第二行包含n个整数,依次表示涛涛的记录中每位读者的编号。
输出格式
  输出一行,包含n个整数,由空格分隔,依次表示每条记录中的读者编号是第几次出现。
样例输入
5
1 2 1 1 3
样例输出
1 1 2 3 1
评测用例规模与约定
  1≤n≤1,000,读者的编号为不超过n的正整数。

解题思路

  1. n个整数按输入顺序依次登记它们的出现次数。用一个数组array来登记出现次数,数组的长度是n+1,整数k的出现次数保存在array[k]中。数组array的n+1个元素的初值是0。
  2. 登记到整数k时,要做的是:array[k] = array[k] + 1 ,并输出array[k]的值。

参考答案

num = int(input())
ns = [int(s) for s in input().split()]  #列表推导式

count_list = [0] * 1001  #这里用1001,比用1000更好,下面的代码更简洁。
for n in ns:  #依次登记整数的出现次数
    count_list[n] += 1  #出现次数加1
    print(count_list[n], end=' ')

小结

  1. 解答本题的关键点是,想到“用一个数组array来登记出现次数,数组的长度是n+1,整数k的出现次数保存在array[k]中。”
  2. 约定“整数k的出现次数保存在array[k]中”的做法的前提是,读者的编号为不超过n的正整数。“评测用例规模与约定”一栏中叙述的内容表明满足这一前提。
  3. 如果“读者的编号为不超过n的正整数”这一前提不满足,那么可以使用Python的字典来存储各个整数的出现次数。
  4. “count_list = [0] * 1001”,用1001,不用1000的理由是: 这使得整数k的出现次数存储在array[k]内,而不是array[k-1]内。例如,整数1000的出现次数存储在array[1000]内,而不是array[999]内。
  5. 语句"count_list = [0] * 1001"中,把1001换成num+1也是可以的,num是整数的个数。