一、题目描述
跳房子,也叫跳飞机,是一种世界性的儿童游戏。
游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子都被选完,房子最多的人获胜。
跳房子的过程中,如果有踩线等违规行为会结束当前回合,甚至可能倒退几步。
假设房子的总格数是count,小红每回合可能连续跳的步数都放在数据steps中,请问数组中是否有一种步数的组合,可以让小红三个回合跳到最后一格?如果有,请输出索引和最小的步数组合,数据保证索引和最小的步数组合是唯一的。
输入描述
第一行输入为每回合可能连续跳过的步数,它是整数数组类型。
第二行输入为房子总格数。
[1,4,5,2]
7
输出描述
返回索引和最小满足要求的步数组合。
注意:顺序保持steps
中的原有顺序。
注:count <= 10000; 3 <steps.length <= 10000; -100000 <= steps[i] <= 100000;
[5,2]
二、解题思路
遍历数组,利用rest_num存储target(总长)-num(每次遍历步数),存放在hash表中,通过rest_num是否在hash表中出现,判断是否两步走完全长,更新索引值,可能会出现多种两步走完全长的情况,此时就需要hash表中不仅存数值,也要存索引,用来更新现有的min_idx_sum。
找到索引和最小的之后,输出格式为列表,则使用列表储存,再进行格式化输出
三、详细代码
# 输入步数列表,注意需要去除最开头和最末尾的中括号
nums = list(map(int, input()[1:-1].split(",")))
target = int(input())
# 初始化索引和最小值,这里可以取inf,也可以取nums长度乘2
min_idx_sum = len(nums) * 2
# 构建哈希表,储存每一种步数首次出现的下标
hash_dic = dict()
# 初始化答案列表
ans = [0, 0]
# 遍历nums
for i, num in enumerate(nums):# i是索引,num是该索引所对应数组的值
# 计算target-num的值rest_num
rest_num = target - num
# 若rest_num位于哈希表中,说明其曾经出现过
# rest_num和num相加等于所需要的结果target
if rest_num in hash_dic:
# 若此时min_idx_sum大于两者下标和
# 则更新min_idx_sum和ans
if min_idx_sum > hash_dic[rest_num] + i:
min_idx_sum = hash_dic[rest_num] + i
# 注意题目要求两个元素保持原有顺序
ans = [rest_num, num]
# 若num不在哈希表中,说明它第一次出现,记录其下标
# 由于我们希望两数的下标和尽可能小
# 故对于重复出现的数字,只记录其第一次出现的下标即可
if num not in hash_dic:
hash_dic[num] = i
# 输出答案,注意要按照格式输出
print(f"[{ans[0]},{ans[1]}]")
四、额外补充
看不懂代码自己稍微debug一下即可看懂,debug代码如下,在debug的过程中即可看懂相关代码
# 输入步数列表,注意需要去除最开头和最末尾的中括号
nums = [1,4,5,2]
target = 7
# 初始化索引和最小值,这里可以取inf,也可以取nums长度乘2
min_idx_sum = len(nums) * 2
# 构建哈希表,储存每一种步数首次出现的下标
hash_dic = dict()
# 初始化答案列表
ans = [0, 0]
# 遍历nums
for i, num in enumerate(nums):
# 计算target-num的值rest_num
rest_num = target - num
# 若rest_num位于哈希表中,说明其曾经出现过
# rest_num和num相加等于所需要的结果target
if rest_num in hash_dic:
# 若此时min_idx_sum大于两者下标和
# 则更新min_idx_sum和ans
if min_idx_sum > hash_dic[rest_num] + i:
min_idx_sum = hash_dic[rest_num] + i
# 注意题目要求两个元素保持原有顺序
ans = [rest_num, num] # 存入到hash表中的肯定在前面已经遍历过。
# 若num不在哈希表中,说明它第一次出现,记录其下标
# 由于我们希望两数的下标和尽可能小
# 故对于重复出现的数字,只记录其第一次出现的下标即可
if num not in hash_dic:
hash_dic[num] = i
# 输出答案,注意要按照格式输出
print(f"[{ans[0]},{ans[1]}]")