硕士python练习题,难倒同学无数_(:з」∠)_

问题遇到的现象和发生背景

题目要求:
输入
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个


a = int(input('type a number(>0):'))
b = []
for i in range(a):
    b.append([int(n) for n in input('type two numbers,split by space:').split()])

x = int(input('type a number to find in the list:'))

c = [[n[0] for n in b],[n[1] for n in b]]

c[0].sort()  # 其实有没有 sort 都一样
c[1].sort()

d = [len([1 for n in c[0] if n<=x]),len([1 for n in c[1] if n>=x])]

print(b)
print(c)
print(d)
print(min(d))

你们老师的思路是这样的,输入的多组数字,有行转列,即 b -- > c

然后,对每行中符合条件的数字统计,得出的是两个数字,d 列表,然后 d 中最小的数字,就是指定的数字 x 出现的次数

用字典统计就行了

你题目的解答代码如下:

n = int(input())
li1 = []
li2 = []
for i in range(n):
    a,b = map(int,input().split())
    li1.append(a)
    li2.append(b)
for i in range(min(li1),max(li2)+1):
    m = 0
    for a,b in zip(li1,li2):
        if a<=i<=b:
            m += 1
    print(i,m)

img

如有帮助,望采纳!谢谢!

原题

img


翻译:
问题 2.3. 多组
输入文件名:标准输入
输出文件名:标准输出
时间限制:2秒
内存限制:256 MB
考虑整数 S 的多重集,自然数的 n 连续区间的并集:
S = [l_1..r_1] U[l_2..r_2] U [l_3..r_3] U..... U [l_n..r_n].我们称 D 是一组 S 中的唯一数字。 对于D中的每个数字x,如果S中出现x,则求出数字。输入第一行包含整数n(1 ≤ n≤100,000), union.接下来的每行 n 行包含两个整数 l_i 和 r_i(1 ≤ l_i ≤ r_i≤ 100,000),即第 i 个区间的最小值和最大值。 输出对于 D 中的每个数字 x 在单独的行中打印两个整数,数字 x 和 x 在 S 中的出现次数。示例: