首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是一个代码战争的挑战,我通过了所有的测试,但它说我的代码运行太长时间?

这是一个代码战争的挑战,我通过了所有的测试,但它说我的代码运行太长时间?
EN

Stack Overflow用户
提问于 2022-08-13 10:10:12
回答 1查看 137关注 0票数 -1

我正在解决CodeWars的挑战弹跳球

一个孩子正在一座高楼的第九层玩球。这层楼的高度是众所周知的。 他把球扔出窗外。这个球反弹(例如),达到其高度的三分之二(反弹0.66)。 他的母亲从离地面1.5米的窗户往外看。 母亲会多少次看到球在她的窗前传球(包括球下落和弹跳的时候)? 一个有效的实验必须满足三个条件:

  • 仪表中的浮动参数"h“必须大于0。
  • 浮动参数“弹跳”必须大于0且小于1
  • 浮动参数“窗口”必须小于h。

如果满足上述三种条件,则返回一个正整数,否则返回-1.

注意:

只有当篮板球的高度严格大于窗口参数时,才能看到球。

我的代码:

代码语言:javascript
复制
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

我的代码通过了所有的测试,但是它说我的代码运行时间太长了,有什么问题吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-08-13 17:39:07

您忘了检查条件,因此进入了一个无限循环。如果在代码开始时添加以下内容,则很容易被接受:

代码语言:javascript
复制
    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。你的只需要几秒钟,而三轮车只需要几微秒:

代码语言:javascript
复制
83994097  3571749 us  Julian
83994097       61 us  trincot

在网上试试!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73343337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档