跳房子 python版

一、题目描述

跳房子,也叫跳飞机,是一种世界性的儿童游戏。

游戏参与者需要分多个回合按顺序跳到第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]}]")

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值