兔子最多能跳50厘米远。它想穿越到河的另一边,但它不会游泳。所以唯一的希望是跳到河上的岩石上,这些岩石位于一条直线上。岩石的位置从开始位置开始测量,假设兔子从0厘米标记开始。对岸可以被视为一块大石头。它是岩石组中的最后一块岩石。
例如,岩石位于位置32, 46, 70, 85, 96, 123,而对面的河岸位于位置145。对于上面的例子,它需要进行3次跳跃,在岩石0(起点)、岩石46和岩石96到达另一边(岩石146)。
兔子每跳一次都会跳得尽可能远。到达河对岸所需的最小跳跃次数是多少?
你可以假设最多有20块岩石(包括对岸)。
编写一个函数rabbit,读取表示岩石位置的元组。您的函数应该返回所需的最小跳跃次数,如果兔子无法到达河的另一边,则返回-1。您可以假设岩石在元组中的位置是有效的(大于0),并且它们是按升序排序的。
def rabbit(rocks):
jumps = 0
prev = 0
cursor = 0
i = 0
while i < len(rocks):
rock = rocks[i]
if rock - prev < 50:
cursor = rock
i += 1
continue
elif rock - prev >= 50 and prev != cursor:
jumps += 1
prev = cursor
continue
else:
return -1
if i == len(rocks):
rock = rocks[i-1]
if rock - prev <= 50:
jumps += 1
if jumps == 0:
return -1
return jumps
这里的一些案例:
兔子((32, 46, 70, 85, 96, 123, 145))应该生成一个3。但是我得到了4个。
兔子((30, 70, 75, 120, 160, 170, 180, 190, 200, 246, 258))对于这种情况。最后一跳有问题。虽然我得到的答案是7,但代码的最后一部分似乎与第一种情况相矛盾。
以下是我的解决方案:
MAX_JUMP_DIS = 50
def rabbit(rocks):
ans_rock = []
def jump(rocks, cur_pos=0):
list_possible = [rock for rock in rocks if rock <= MAX_JUMP_DIS + cur_pos]
if len(list_possible) == 0:
return -1
jump_pos = max(list_possible)
ans_rock.append(jump_pos)
[rocks.remove(rock) for rock in list_possible]
if len(rocks) != 0:
return jump(rocks, cur_pos=jump_pos)
if jump(rocks) == -1:
print(-1)
else:
print(f"rock list: {ans_rock} count:{len(ans_rock)}")
rabbit([32, 46, 70, 85, 96, 123, 7000])
rabbit([32, 46, 70, 85, 96, 123, 145])
rabbit([30, 70, 75, 120, 160, 170, 180, 190, 200, 246, 258])
输出:
-1
rock list: [46, 96, 145] count:3
rock list: [30, 75, 120, 170, 200, 246, 258] count:7
使用递归的替代解决方案:
def rabbit(rocks, jumps=0):
max_jump = max(element for element in rocks if element <= 50)
last = rocks[-1]
if max_jump >= last:
return jumps + 1
else:
return rabbit([rock - max_jump for rock in rocks if rock > 50], jumps + 1)
print(rabbit([32, 46, 70, 85, 96, 123, 145]))
print(rabbit([30, 70, 75, 120, 160, 170, 180, 190, 200, 246, 258]))
输出:
3
7
我更改了部分代码如下。
if rock - prev <= 50:
cursor = rock
i += 1
continue
elif rock - prev > 50 and prev != cursor:
jumps += 1
prev = cursor
continue
因为兔子可以跳50度,这意味着它可以跳50度,所以需要rock-prev
在此之后,我得到如下输出:
print(rabbit((32, 46, 70, 85, 96, 123, 145)))
#3
print(rabbit((30, 70, 75, 120, 160, 170, 180, 190, 200, 246, 258)))
#7
问题内容: 我发布此消息是因为该主题刚刚在另一个问题/答案中提出,并且该行为没有得到很好的记录。 考虑数据框 我想获取由column定义的每个组的第一行和最后一行。 我试过了 但是,这并没有给我我所期望的。 如何获得每个组中的实际第一个和最后一个值? 问题答案: 一种选择是使用该方法: 但是,我还没有找到一种将它们整齐地聚合的方法。当然,总是可以使用构造函数: 注意:我明确使用了该属性,否则您必须
我需要总是从对象“链接”获得最后一个元素 我怎么能这样做?解析是怎么回事?
我的域和日期字段更新了,我想通过它进行搜索
我有一个主类,该类将输出打印到控制台。。。 例如,如果行中包含A和B,我需要打印“Apple” 我将在主方法中通过首先实例化该类的对象来实现这一点,即。 代码示例:
问题内容: 我正在使用apache-httpclient-4.3。我将分析一个HTTP请求,尤其是查询字符串参数,但是 我不确定这意味着什么。我应该使用某些配置API的构造函数参数(那是什么?HostConfiguration作为类不再可用)。但是在构建阶段,我直接通过url传递查询参数: 我找不到不使用不推荐使用的方法从我的 请求 对象读回参数( var1,var2 )的方法,这种方法应该很简单