我正在解决CodeWars的挑战弹跳球
一个孩子正在一座高楼的第九层玩球。这层楼的高度是众所周知的。 他把球扔出窗外。这个球反弹(例如),达到其高度的三分之二(反弹0.66)。 他的母亲从离地面1.5米的窗户往外看。 母亲会多少次看到球在她的窗前传球(包括球下落和弹跳的时候)? 一个有效的实验必须满足三个条件:
如果满足上述三种条件,则返回一个正整数,否则返回-1.。
注意:
只有当篮板球的高度严格大于窗口参数时,才能看到球。
我的代码:
def bouncing_ball(h, bounce, window):
ball_h = h
num = 0
#initial drop
if ball_h>window:
num+=1
ball_h = ball_h*bounce
else:
num = -1
while ball_h > window:
num +=2
ball_h = ball_h*bounce
return num我的代码通过了所有的测试,但是它说我的代码运行时间太长了,有什么问题吗?
谢谢
发布于 2022-08-13 17:39:07
您忘了检查条件,因此进入了一个无限循环。如果在代码开始时添加以下内容,则很容易被接受:
if not (h > 0 and 0 < bounce < 1 and window < h):
return -1通常,这样的约束是保证,也就是说,您可以假设每个输入都满足它们。但是在这种情况下,如果它们没有实现,就会被告知返回-1,所以您不能假设它们是。
也就是说,trincot的封闭公式应该更好。也许在代码战中有一个更难解决的问题,这是需要的。但在这一次中,您的解决方案(上面的修复)和trincot的测试结果在大约0.5秒内就被接受了(这似乎是基线,大部分时间由法官实际占用,您的解决方案实际上需要大约0.000034秒,而trincot的0.000023秒(通过在其他地方运行codewars的测试用例来衡量)(一旦解决了kata问题,您就可以看到它们)。
我还在返回前添加了assert num <= 87,这仍然被接受。对于86,它失败了。所以你的循环实际上没有什么可做的。一开始,我怀疑他们可能没有对更困难的案例进行测试,因为对于float来说,大规模的结果可能需要太多的精确性,但事实似乎并非如此。例如,对于参数100, 0.9999999, 1.5,您和trincot都返回相同的结果83994097。你的只需要几秒钟,而三轮车只需要几微秒:
83994097 3571749 us Julian
83994097 61 us trincothttps://stackoverflow.com/questions/73343337
复制相似问题