CCF CSP认证 历年真题自练 Day8

CCF CSP认证 历年真题自练 Day8

题目一

试题编号: 201503-1
试题名称: 图像旋转
时间限制: 5.0s
内存限制: 256.0MB
问题描述:
问题描述
  旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
  计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。
输入格式
  输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。
  接下来n行每行包含m个整数,表示输入的图像。
输出格式
  输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
样例输入
2 3
1 5 3
3 2 4
样例输出
3 4
5 2
1 3
评测用例规模与约定
  1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。

题目分析(自己理解)

  1. 先看输入输出,输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。常规操作:
    n,m=map(int,input().split())

  2. 后面还要输入每一行的值,我选择列表l=[]存储。

  3. 还是选择列表嵌套的方式做一个类矩阵。有行我就在l[]里面嵌套n个列表。
    for i in range(n):
    s = list(map(int,input().split()))
    image += [s]

  4. 输入的类矩阵已经实现,接下来进行旋转操作,我们不难发现新矩阵的第一列是输入矩阵的第一行的倒序。后面的每一列同理。

  5. 新矩阵有多少列?是 输入矩阵 的行数。

  6. 完整代码:

n,m = list(map(int,input().split()))
image = []
for i in range(n):
    s = list(map(int,input().split()))
    image += [s]
# 图像旋转即读入的二维数组的最后一列变为旋转后的第一行
# 倒数第二列变为新图象的第二行
img = []
for i in range(m - 1, -1, -1):# 从最后一列到第一列
    s = []
    # 从上到下
    for j in range(n):
        s += [image[j][i]]
    img += [s]
# 输出图像:
for i in range(m):
    print(img[i][0],end='')
    for j in range(1, n):
        print('',img[i][j], end='')
    print()


题目二

试题编号: 201503-2
试题名称: 数字排序
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
  输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。

题目分析(自己理解)

  1. 这道题很像我Day3练的题目。先看输入要求:输入的第一行包含一个整数n,表示给定数字的个数。那就直接n=int(input())选择字典作为容器,为什么?字典的key对应输入的整数(唯一)value对应次数(不唯一),第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。只要用户输入一个dic中不存在的key我就添加到dic中,value设置初始值为1,输入一个存在的key那我就当前key对应的value+1,一直遍历完所有的输入(key),这个字典就是{整数1:次数,…,整数n:次数}
  2. 着将字典按key从小到大排序以元组的形式存入列表,方便二次排序。此时l=[(5,3),(4,1),(3,4),(2,3),(1,1)]
  3. 好的,列表嵌套元组,现在可以使用匿名函数lambda对第二个元素进行排列。l.sort(key=lambda x:x[1],reverse=True)使用sort方法。
    4.然后依次输出即可。上代码!!!:
n=int(input())
dic={}
#构造字典存储{数:个数}
for i in list(map(int,input().split())):
    if i not in dic:
        dic[i]=1
    else:
        dic[i]+=1
l=[]
#将字典按key从小到大排序以元组的形式存入列表
for i in sorted(dic.keys()):
    l.append((i,dic[i]))

#对列表按其元组第二个值排序
l.sort(key=lambda x:x[1],reverse=True)

for i in l:
    print(i[0],i[1])



总结

当遇到类矩阵可以使用列表嵌套来表示,但是由于判断条件不唯一,所以排序的时候可以先用字典存储,利用key为一的特点先利用sorted()函数排一遍,再将此时的字典的items放入列表中嵌套的元组中,一个item对应一个元组,利用sort方法中的key的lambda匿名函书进行第二个元素的排序。
学校的树还挺绿:
CCF CSP认证 历年真题自练 Day8_第1张图片

你可能感兴趣的:(算法,python,学习方法)