毒蘑菇 最大体力

location_bigger = [0]
m = 3 # 初始体力
N = 9 # 方块个数

A = [1, 2, -1, -2, -1, -2, 1, 1, 2]
#A = [1, 2, 1, 2, 1, 2, 1, 1, 2] # 每个方块上增加的体力值

# 查询出增加体力值 >=1 的位置
for i in range (0, N):
    if A[i] >= 1:
        location_bigger.append(i+1)
length_location_bigger = len(location_bigger)

A_sum = [m]
for j in range (1, length_location_bigger):
    X = A_sum[j-1]+A[location_bigger[j]-1]-(location_bigger[j]-location_bigger[j-1])
    A_sum.append(X)

sort_A_sum = A_sum.copy()
sort_A_sum.sort()
if sort_A_sum[0] <= 0:
    print('can not finish')
else:
    print(A_sum[-1])

题目:从起点开始接下来有 n 个方块,相邻方块间的距离都为 1,每个方块上有增加体力的食用蘑菇或减少体力的毒蘑菇,蘑菇带来的体力改变是已知的。一个人初始体力为 m,每次可以往前跳任意个方块,体力耗尽就会死掉。每跳一次消耗的体力与跳的距离成正比,比例为 1。问这个人能否跳到终点,如果能,求可能剩余的最大体力。

1. 本人之前未接触过python,刚学了一周,故还有一大部分函数没有用过,只能用最基本的思路来解决这个问题,如果有哪位大哥可以更简单的解决问题,请留言但勿喷.
2. 一直以为算法工程师就是安心做算法,而且最好是博士期间算法的应用或者延申,但是目前面试结果来看,算法不重要,刷题才是根本.

题目困惑 1 . 就我个人来说,首先会考虑的是食用蘑菇增加多少体力,毒蘑菇减少多少体力,每次增加或减少的体力是否一样等等的问题(我刚看到这个题就是这么想的,因为本人读博期间只研究时间序列,单变量多变量,而且从没有接触过python,所以遇到这个问题,觉得很多数据都是未知的,如果直接给一个list肯定是更清晰的)。但在这个问题里,不要考虑这个,面试官只是把一个list用一系列的方块来描述了,而且每个方块上的值就是对应的list中的值(大于0即为食用蘑菇,小于0即为毒蘑菇)。
题目困惑 2 . 就这个问题而言,我们要考虑的是,在蹦之前就消耗掉了体力,还是吃掉蘑菇之后才消耗蹦那一下的体力。比如,这个人当前体力为 1,如果蹦之前就消耗体力,那么无论接下来怎样,都会在蹦那一瞬间死掉,这是一种分析方法;而如果是吃完蘑菇后消耗蹦那一下的体力,则是另一种分析方法。而在面试官的思路中,应当是吃掉蘑菇后再消耗之前蹦的体力,即后一种分析方法。

解题思路:
第一步:先举一个简单的例子,初始体力为 m,一个长度为 6 的方块(即长度为 6 的list):[1, 2, -1, 2, 3, 4],跳到第一个上面,当前体力为 m+1-1,再跳到第二个上面,体力为 m+1-1+2-1,那么可以得出,只要数字大于等于1,那么都应该往这个方块上跳。
第二步:这个人当前体力为m,离这个人目前位置最近的下一个 >=1 的数字(x)与这个人当前的距离(d),如果d>m+x,则无法到达终点,如果不存在这样的问题,则可以到达终点,最大的体力即所有大于等于1的数字相加,加上初始体力m,再减去方块数量n。因为面试官说是从地上跳上去的,所以跳到第一个上面也需要消耗一个体力,因为总木块数量为n,所以当到达终点时,一共消耗的体力为 n。

测试list1:[1, 2, -1, -2, -1, -2, 1, 1, 2], 初始体力 m<4 时,则不能到达终点,输出为-1;初始体力 m>=4 时,可以抵达终点,最终结果为 m-2
测试list2:[1, 2, 1, 2, 1, 2, 1, 1, 2], 最终结果为 (m+1+2+1+2+1+2+1+1+2-9 = m+4)
#字节跳动##笔试题目#
全部评论
```go func bMmxI9(nums []int, m int) (int, bool) { end := m for now := 0; now < len(nums) && now < end; now++ { if nums[now] > 0 { end += nums[now] } } return end - len(nums), end-len(nums) >= 0 } func main() { fmt.Println(bMmxI9([]int{1, 2, 1, 2, 1, 2, 1, 1, 2}, 3)) } ```
点赞
送花
回复
分享
发布于 2022-11-09 16:04 陕西

相关推荐

头像
不愿透露姓名的神秘牛友
04-10 20:44
2024年4月10日,3月6日滑倒骨折后的第35天,焦绿地等待着腾讯二面和美团一面的结果,已经快过去两天了,频频刷新应聘进度看到的依旧是复试和初试的链接四月快到中旬了,一个offer都没有,有时候会想,如果能重来就好了,3月6日的那个下雨的晚上,把那节没什么用的课翘掉就好了本来已经准备了很久,去年八九月就开始做项目,十一月搞了简历,寒假背了八股。和大部分牛友一样,二月底三月初大厂实习一开就开始投递,做了一份又一份恶心的测评,就在受伤的那一天还约了第二天某小厂的面试。然后一切都被突如其来的意外打破了,进了医院,做了手术,前前后后在医院里呆了两个多礼拜,术后的疼痛、肿胀、出血、一天五瓶的吊针让我完全没有学习的念头,于是在医院里的每一天,我都在消沉和落寞中度过。直到3.24出院后的第二天,钉钉的约面打断了我的内耗,二十天什么都没看的我手忙脚乱地复习了半天的算法和八股,然后匆匆上阵,在面试中用一只手不熟练地敲着键盘,结果当然是不出意外地秒挂了如果能重来的话,那天没有受伤的话,那3.6到3.26这段时间我会在学校里继续保持着规律的学习,那钉钉一面,和现在等待着的腾讯二面和美团一面的结果是不是会有点不一样?果然如那一句话所说,“成功只是一时的,而失败和遗憾总是贯穿人生始终。”然后会想到更远之前的事情,两年前我还大一的时候,那时候很不巧我也因为受伤待在家里,但那时候是很快乐的,没有学业的压力,也不用天天焦虑什么实习什么工作,而且还有一个每天分享学校的天空给我的女朋友。那时候不懂,现在再回想起来那时候的自己,妈的,那时候你小子是真他娘的身在福中不知福啊可惜,很遗憾,因为一系列的阴差阳错,我们没有走得很长远就走散了。如果能重来的话,如果让我回到那年的暑假再做一次选择的话,如果那一系列巧的不能再巧的事但凡有一件没有发生的话,那结果是不是会有点不一样?可惜不论是3.6号前充实着准备实习的我,还是两年前沉浸在不自知的幸福中的我,都是现在的我无可挽回的过去,无论“如果能重来”的假设在我的脑海中如何千百回地上演着,它们也终究不会变成现实。分针秒针一点一点向前,只有回忆是人类目前唯一掌握的时间穿梭。感慨了那么多,还是要回归现实,经历了煎熬而动荡的3月,后天要去医院复查了,希望一切顺利,2024剩下的日子,请给我些好运吧
点赞 评论 收藏
转发
5 5 评论
分享
牛客网
牛客企业服务