面试算法真题01

这里写自定义目录标题

题目描述:

有M个(数量100个以内)箱子,每个箱子里面装有若干玩具球,已知第1个箱子玩具球的个数比第2个多2个,第2个箱子比第三个箱子多3个,第3个箱子比第4个多7个,第4个箱子比第5个多25个,,第5个箱子比第6个多121个,以此列推,已知最后一个箱子有K个玩具球,请采用递归算法计算所有M个箱子的玩具球总数。

在这里插入图片描述
解题思路:假设有10个盒子,最后一个盒子的数量为1,由于采用递归算法,可以用递归计算出每两个盒子之间的数量差值

数量差值思路有两个理解方式,验证后都对,
思路一:
从差值数2 3 7 25 121 …和盒子的序号可以看出,假定目前的前一个盒子索引号为i(i从1开始)后一个盒子的索引为i+1,差值为i的阶乘再加1,从此就可非递归计算出差值序列。

m, k= 10, 1

import math
cha1 = []
def get(i):
    for i in range(1,m):
        cha1.append(math.factorial(i)+1)

思路二
在这里插入图片描述
也是结合盒子序号看,画10个盒子描述很明显,这种是用递归求差值序列

cha2 = []
Box = []
def get2(i):
    if i == 1:
        cha2.append(2)
        return 2
    else:
        tmp = get2(i-1)
        res = tmp*(i-1) + tmp-(i-1)
        cha2.append(res)
        # print([cha2[j] for j in range(len(cha2))])
        return res
 get2(9)

注意坑来了:

差值序列要从后往前加,得到的才是每个盒子的玩具球数量Box[],最后还要对Box[]内所有元素进行一次总和。

Box.append(k)
for i in range(m-1,0,-1):
    Box.append(Box[m-i-1] + cha2[i - 1])
print(sum(Box))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值