笔试题:跳跃游戏每一次比上一次多跳1(数学,二进制搜索)

在数轴上有一个起点和一个终点,第一步跳1,第二步跳2,第三步跳3,… 但是可以左右跳,最后问最少跳几步
例子: 0 ——> 2: 0 -> 1 -> -1 -> 2

import math

#二进制进行暴力破解
def brute(n):
    k = 1
    # 遍历跳 1,2,3,4,5...次
    while True:
        # 生成每一次的每一条的步数列表
        base = list(range(1, k + 1))
        # 生成每一跳的左右遍历的二进制数字
        for i in range(2 ** k):
            dist = 0
            # 获取每一位的数值计算最后跳跃坐标
            for j in range(k):
                # i & (1 << j) 将i第j号位上的数值进行保留其余归0,可以用来判断该位是否为0
                coef = 1 if i & (1 << j) else -1
                dist += base[j] * coef
            if dist == n:
                return k
        k += 1


def math_method(n):
    # 求根
    k = math.ceil((math.sqrt(8 * n + 1) - 1) / 2)
    # 求差值
    r = k * (k + 1) // 2 - n
    # 差值要是2的倍数
    if r % 2:
        if k % 2:
            return k + 2
        else:
            return k + 1
    else:
        return k


if __name__ == '__main__':
    for i in range(1, 20):
        print(i, math_method(i), brute(i))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值