问题遇到的现象和发生背景
题目要求:
输入
5(输入的个数)
1 10 (1:10,也就是1,2,3,4,5,6,7,8,9,10)
7 9
3 8
4 7 (4,5,6,7)
5 5 (5:5 只有5)
输出
1 1 (1、计算1出现的次数)
2 1(2、2出现的次数,为1)
3 2(3、3出现的次数,为2)
4 3
5 4
6 3
7 3
8 3
9 2
10 1
问题相关代码,请勿粘贴截图
from collections import Counter
len_as = input()
len_a = int(len_as)
all_data = []
arr_b = []
for _ in range(len_a):
str_b = input()
arr_b = str_b.split(' ')
for i in range(int(arr_b[0]), int(arr_b[1]) + 1):
if int(arr_b[0]) == int(arr_b[1]):
all_data.append(int(arr_b[0]))
break
all_data.append(i)
nummap = Counter(all_data)
# print(nummap)
uniq_data = list(set(all_data))
uniq_data.sort()
for d in uniq_data:
print("%s %s" % (d, nummap.get(d)))
运行结果及报错内容
代码没有任何问题,功能可以实现,只是时间复杂度过大,需要更好的算法
我的解答思路和尝试过的方法
教授给出了一个非常牛X的算法,奈何我无法转化为python代码,算法如下:
假如需要查找6出现的个数
因为在[1 10]这个数组里
1≤6
10≥6
所以包含6
(我是数轴)—[1—6—10]—→√
在[7 9]这个数组里
7≮6
(我是数轴)—6—[7—8—9]—→X
所以不包含6
因此[a,b]如果满足
a≤6
b≥6
则包含6
(我是数轴)—[a—6—b]—→√
如果满足
a>6
则不包含6
(我是数轴)—6—[a—b]—→X
或者满足
b<6
则不包含6
(我是数轴)—[a—b]—6—→X
现在将实例中5个数组
[1 10]
[7 9]
[3 8]
[4 7]
[5 5]
写成2个数组
A=[1,7,3,4,5] 左列
B=[10,9,8,7,5] 右列
找到A里≤6的数有4个(可能有6的数组数量)
B里<6的数有1个(在可能有6的数量里,没有6的数组数量)
所以6的出现的次数为4-1=3个