二分查找
a=[1,3,5,7,9] # 序列 k=3 # 目标 l=0 # 开头(注意,是索引号) r=4 # 结尾(注意,是索引号) while l+1!=r: # 是否只剩一个 mid=int((l+r)//2) # 中间(注意,是索引号) if a[mid]<k: # 小于目标 l=mid # 结尾移到中间位置上(往大走) elif a[mid]>k: # 大于目标 r=mid # 开头移到中间位置上(往小走) if a[mid]==k: # 命中目标 print(a[mid],'的位置是',mid)
密码问题:
根据密码本和电子钥匙,破解笔记本电脑的密码。
密码本是一个非降的整数序列,电子钥匙是一个整数,得到密码的方法是在密码本中找到最接近电子钥匙的整数(如果多个符合条件,输出最小的一个)。
例如:
密码本为下面的列表
a=[1,22,43,45,45,55,60,70,89]
电子钥匙为整数44
满足条件的整数为43和45,最终的密码为43
a=[1,22,43,45,45,55,60,70,89] # 密码本(序列) k=int(input()) # 电子钥匙(目标) l=0 # 开头(注意,是索引号) r=8 # 结尾(注意,是索引号) while l+1!=r: # 看是否只剩一个 mid=int((l+r)//2) # 中间(注意,是索引号) if a[mid]<k: # 小于目标 l=mid # 往大走 elif a[mid]>k: # 大于目标 r=mid # 往小走 if a[mid]==k: # 等于目标 break # 停 if k-a[l]<=a[r]-k: # 看两个目标距离谁大谁小,如果左边的小,或者,两边相同距离 print(a[l]) # 打出左边的 else: # 否则 print(a[r]) # 打出右边的
罗马数字问题:
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
27写做 XXVII,即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减去数 1 得到的数值 4。同样地,数字 9 表示为 IX。
这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
现编写输入一个罗马数字,输出其整数结果,请编程实现上述功能,或补全代码。
例如,当输入XXII时,输出22;当输入MCMXC时,输出1990.
rmdict = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000} rm = list(input("请输入正确的罗马数字:")) num, prew = 0, 1 for ch in rm[::-1]: w = rmdict[ch] if prew > w: num = num - w else : num = num + w prew = w print(num)