华为OD-2024年E卷-跳房子1[100分] -- python

问题描述:

跳房子,也叫跳飞机,是一种世界性的儿童游戏。
游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格。跳房子的过程中,可以向前跳,也可以向后跳。
假设房子的总格数是count,小红每回合可能连续跳的步数都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到最后一格?如果有,请输出索引和最小的步数组合。
注意:数组中的步数可以重复,但数组中的元素不能重复使用。提供的数据保证存在满足题目要求的组合,且索引和最小的步数组合是唯一的。
输入描述
第一行输入为每回合可能连续跳的步数,它是int整数数组类型。实际字符串中整数与逗号间可能存在空格。
第二行输入为房子总格数count,它是int整数类型。
输出描述
返回索引和最小的满足要求的步数组合(顺序保持steps中原有顺序)
补充说明
count<=1000,0<=steps.length<=5000,-100000000<=steps[i]<=100000000

[1,4,5,2,2]
7
[5,2]

解题思路:

  1. 直接列表模拟,两数之和等于房子的总格数。
  2. 按照索引和排序输出最小的

麻烦的可能还是输入列表的处理(包含 '[' 和 ']' )

如何优化呢?

在字典中查找count - 当前值,并将当前值及其索引加入字典。

代码实现:

arr = str(input())
arr = arr.replace('[','').replace(']','')#replace不能用于列表
arr = list(map(int,arr.split(',')))
count = int(input())
ans = []

# for i in range(len(arr)-1):
#     for j in range(i+1,len(arr)):
#         if arr[i] + arr[j] == count:
#             ans.append((i+j,arr[i],arr[j]))

dic = {}
for i in range(len(arr)):
    if count-arr[i] in dic:
        ans.append((dic[count-arr[i]]+i,count-arr[i],arr[i]))
    dic[arr[i]] = i#在判断后,避免搜索本身
ans.sort(key = lambda  x : x[0])#按照索引和排序
print(ans[0][1],ans[0][2])

你可能感兴趣的:(华为od,python,数据结构)