首页 > 解决方案 > 球弹跳问题,舍入误差还是算法错误?

问题描述

在 codewar 上有弹跳问题说:

""" 一个孩子在一座高楼的第 n 层玩球。这层楼的高度 h 是已知的。

他把球扔出窗外。球反弹(例如)到其高度的三分之二(反弹 0.66)。

他的母亲从距离地面 1.5 米的窗户向外望去。

妈妈会看到多少次球从她的窗前经过(包括它下落和弹跳的时候?

有效实验必须满足三个条件: 以米为单位的浮动参数“h”必须大于 0 浮动参数“bounce”必须大于 0 且小于 1 浮动参数“window”必须小于 h。如果以上三个条件都满足,则返回一个正整数,否则返回-1。

注意:只有反弹球的高度严格大于窗口参数才能看到球。

例子:

问题并不难,在对数时间内通过以下方式解决:

    def bouncingBall(h, bounce, window):
        if  h > 0 and window < h and bounce > 0 and bounce <1:
            ct=1
            while bounce*h > window:
                ct += 2
                h *= bounce
            return ct
        else:
            return -1

我的第一个冲动是像这样在恒定时间内解决问题:

    def bouncingBall(h, bounce, window):
        import math
        return 2*int(math.log(window/h,bounce))+1 if h > 0 and window < h and bounce > 0 and bounce <1 else -1

不工作,因为 19 次通过了测试,3 次没有通过。错误:“3 应该等于 1”,2 次;“退出代码”,1次。我认为这是四舍五入的问题,但仍然没有解决方案。希望有人帮忙!

标签: pythonalgorithmfunction

解决方案


实际上,这有点棘手,我从测试输入中发现了它。

在计算时,您假设如果球会弹到窗口,妈妈就能看到。我也是这么想的。但是在查看了第一个测试用例(h=2,bounce=0.5,window=1,ans=1)之后,我知道球需要高于窗口才能让妈妈看到。所以加了0.001。 解决方案

def bouncing_ball(h, bounce, window):
    if h <= 0 or bounce <= 0 or bounce >= 1 or window >= h:
        return -1
    return int(math.log((window+0.001)/h, bounce)) * 2 + 1

推荐阅读