题目描述
贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0-N的箱子,每个箱子上面贴有一个数字。
阿里巴巴念出一个咒语数字,查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱了的编号之差的绝对值小于等于咒语数字,
如果存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1
输入描述
第一行输入一个数字字串,数字之间使用逗号分隔,例如: 1,2,3,1
1 字串中数字个数 100000
-100000每个数字值100000
第二行输入咒语数字,例如: 3
1咒语数字100000
输入
6,3,1,6
3
输出
0
注:1.此题的不利于理解的点:藏宝地有编号从0-N的箱子,每个箱子上面贴有一个数字。 翻译:这个数字就是类似一个序列号,依次从0开始
2.这两个箱子上贴的数字相同,同时这两个箱了的编号之差的绝对值小于等于咒语数字, 翻译:就是计算相同数字的索引之差的绝对值。
def find_golden_box(str, num):
num_list=[int(x) for x in str.split(',')]
#对各数字进行计数,并记录编号,形式如 {1:[2,2,3]},表示1出现2次,编号(下标)分别为2和3
dic={}
repeat_num_list=[]
left_num=''
if len(num_list)==len(set(num_list)):
return -1
for i in range(len(num_list)):
if num_list[i] in repeat_num_list:
dic[num_list[i]][0]=dic[num_list[i]][0]+1
dic[num_list[i]].append(i)
# 如果有一个数字与之前的相同,则计算这两个位置的索引之差是否小于咒语数字
if (abs(dic[num_list[i]][2]-dic[num_list[i]][1])<=int(num)):
left_num =dic[num_list[i]][1]
return left_num
else:
#如果没在,将其加入字典中,次数记为1,并加入对应索引
dic[num_list[i]]=[1]
dic[num_list[i]].append(num_list.index(num_list[i]))
repeat_num_list.append(num_list[i])
if left_num=='':
return -1
if __name__=='__main__':
#字符串
#t='AVERDXIVYERDIAN'
#p = 'RDXI'
#ERDXIVYERDXIAN RDXI
#ERDXVYEDXIAN RDXI
#str=input('请输入数字字符串:')
#连续出现次数第K多的字母的次数
#num=input('请输入咒语数字:')
# str='1,2,3,1'
# num=3
str='6,10,8,4,0,3,1,5,3,6'
num=3
left_num=find_golden_box(str,num)
print(left_num)
总结
1.需要考虑两个数字重复的情况
2.可以使用字典套列表的方式存储中间计算过程。(不太清楚是否符合空间占用要求)
3.嵌套列表时需要先给字典的key赋值列表[],否则报错
4.一定记得要遍历列表的索引,否则若有相同数字,取出的值会是第一个出现的索引的值。这个也至关重要,取可迭代对象时,尽量通过索引去取,而不是通过值去取,以避免出现相同的值的情况导致结果不对。