首页 > 技术文章 > CCF201503-Python题解

z-712 2020-09-04 19:24 原文

图像旋转

原题连接:http://118.190.20.162/view.page?gpid=T27

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

 

题解:第一次写时,尴尬,提交超时,总结下教训[j*m-i] 这种运算尽量减少,比较耗时

11 for i in range(1, m+1):
12     for j in range(1, n+1):
13         if j != n: 
14             print(a[j*m-i], end=" ")
15         else:
16             print(a[j*m-i])
17 # a = a[::-1]

 

未超时代码(事实证明,sys.stdin好用,花费时间少)

 1 n, m =input().split()
 2 n, m = int(n), int(m)
 3 
 4 img1 = []
 5 for i in range(n):
 6     a = input().split()
 7     for j in range(len(a)):
 8         a[j] = int(a[j])
 9     img1 += [a]
10 
11 img2 = []
12 for i in range(m-1, -1, -1):
13     tmp = []
14     for j in range(n):
15         tmp += [img1[j][i]]
16     img2 += [tmp]
17 
18 for i in range(m):
19     print(img2[i][0],end="")
20     for j in range(1,n):
21         print("", img2[i][j], end="")
22     print()

 

 1 import sys
 2 
 3 n,m=input().split()
 4 n,m=int(n),int(m)
 5 arr=[list(map(int, sys.stdin.readline().strip().split())) for _ in range(n)]
 6 
 7 for j in range(m-1,-1,-1):
 8     for i in range(n):
 9         print(arr[i][j],end=" ")
10     print()

 

数字排序

原题链接:http://118.190.20.162/view.page?gpid=T26

试题编号: 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的非负整数。

 这里统计个数:

方法一:个数就借用二维数组来标记和计数,在多维类表删除的时候,可以用切片的方法,输出的要求是按第二个元素降序,第一个元素升序,这里借用sort()函数的key来指定,直白说这种方法就是打表!

 

 1 n=int(input())
 2 a=list(map(int, input().split()))
 3 
 4 couple=[]
 5 for i in range(n):
 6     couple.append([a[i],1])
 7 
 8 for i in range(n-1):
 9     for j in range(i+1,n):
10         if couple[i][0]==couple[j][0] and couple[i][1]!=1005 and couple[j][1]!=1005:
11             couple[i][1]+=1
12             couple[j][1]=1005
13 
14 
15 for c in couple[ : ]:
16     if c[1]==1005:
17         index=couple.index(c)
18         del couple[index]
19 
20 couple.sort(key=lambda u:(-u[1],u[0]))
21 
22 for i in couple:
23     print(' '.join(map(str, i)))
View Code

 

当然这种方法在n很大的时候是有风险的,因此方法二使用字典。

 1 n=int(input())
 2 
 3 ans={}
 4 tmp=list(map(int, input().split()))
 5 for t in tmp:
 6     if t in ans.keys():
 7         ans[t]+=1
 8     else:
 9         ans[t]=1
10 res=[]
11 for k,v in ans.items():
12     res.append([k,v])
13 
14 res=sorted(res,key=lambda u:[-u[1],u[0]])
15 for r in res:
16     print(r[0],r[1])

 

 

 

参考链接

https://blog.csdn.net/authorized_keys/article/details/108880112(列表多维排序)

推荐阅读