【华为OD机试】 阿里巴巴找黄金宝箱(Ⅲ)-python

题目描述
贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从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.一定记得要遍历列表的索引,否则若有相同数字,取出的值会是第一个出现的索引的值。这个也至关重要,取可迭代对象时,尽量通过索引去取,而不是通过值去取,以避免出现相同的值的情况导致结果不对。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值