来自CodeFights的catchTheEggs挑战:你能帮我找到我的错误吗?

时间:2018-04-09 15:17:24

标签: python loops

这是来自CodeFights的问题,但一般的前提是:你只是在一家设计糟糕的鸡蛋工厂里找到了一份鸡蛋捕手的工作。 鸡只在工厂的一侧排成一排。 每只鸡的下面都有一条传送带,可以送给你的鸡蛋。如果你在鸡蛋到达的时候在传送带的末端,你会抓住它。如果没有,鸡蛋会落在地板上而你却没有抓到它

在“转弯”期间,蛋向下传送到传送带1的位置单元。 您可以向左移动1个位置,向右移动1个位置,或者保持原位。鉴于输入。返回轮班期间可能捕获的最大蛋数。

为了清理事情,conveyorLength只是意味着你的起始位置。因此,如果有5只鸡并且cL = 3,那么你只能在第一轮中从传送带2,3,4捕获鸡蛋,因为你可以保持放置或以一个增量移动任一方向。这个问题有点棘手,因为你必须找到最好的结果,工人可以采取多种途径来捕获所有的蛋。

- 一个例子:catchTheEggs(3,1,[[1,3],[2],[3]])= 3

- ROUND 1:这里n = 3,cL = 1所以在第一轮中,来自输送机1和3的鸡蛋下降[1,3],你现在正站在cL = 1所以你抓鸡蛋1和鸡蛋3下降。

- 第2轮: cL = 1,因为您决定不在最后一轮中移动。这次只有鸡蛋2滴,所以你移动到cL = 2来抓住它。

- ROUND 3: cL = 2,因为你从第二轮开始抓住了鸡蛋。这次来自输送机3的鸡蛋下降,所以你移动抓住它。

- 你总共抓了3个鸡蛋。

def catchTheEggs(numberOfChickens, conveyorLength, eggs):
# i changed the name of the variables for convenience sake
n = numberOfChickens
cL = conveyorLength
catch = 0

for i in range(0, len(eggs)):

    for j in range(0, len(eggs[i])):
        # is it possible to catch the egg
        if ((eggs[i][j] + 1) == cL) or ((eggs[i][j] - 1) == cL) or (eggs[i][j] == cL):
            cL = eggs[i][j]
            catch += 1
        # say you are at cL=1, and eggs from conveyor 4 drop 4 times: 
        # [[4],[4],[4],[4]] then you should move to conveyor 2, then 3
        # and for the last 2 rounds you can catch them. 
        # so I'm accounting for a scenario like that.   
        elif (abs(len(eggs)) >= n):
            cL += 1

return catch

我无法完成此测试用例:

catchTheEggs(4,2,[[1,4],[1,2,4],[1,3],[2],[1,2,4],[2,3],[3],[2],[1,3,4],[3,4],[1]])

它应该给10,但我的代码给了我14。

1 个答案:

答案 0 :(得分:0)

你的问题是可以在一轮中捕获多个鸡蛋。

你的第一个" if"声明将允许捕蛋器捕获一个鸡蛋,如果它们距离它一个方格。然而,没有任何条件可以防止捕蛋器在捕获到第一个蛋后捕获另一个蛋。

示例:

如果 egg [i] = [2,3]且 cL = 2,则" j" for循环将迭代两次(如len( eggs [i])= 2)。

在第二次迭代中,将考虑 eggs [i] [0] = 2,并且当 cL = 2时,鸡蛋将被捕获。 catch 也会在此处递增, cL 将保持为2。

在第二次迭代中, eggs [i] [1]将等于3,而当 cL = 2时,鸡蛋也将被捕获。

因此,一些 egg 值会导致 cL 增加两次,例如[1,2,4](其中第1和第2位的蛋是都抓住了)。这是输出14而不是10的原因。

要解决此问题,您需要插入 break 语句或其他布尔变量,以防止每轮多次移动到" j" for loop。