首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标返回不正确的食人族数字

目标返回不正确的食人族数字
EN

Stack Overflow用户
提问于 2020-05-31 18:30:56
回答 1查看 394关注 0票数 1

我试图编写一个函数,当给出一个由逗号和目标数字分隔的数字或字符串的列表时,将在该列表中找到与目标相等或可能成为目标的数字数。

数字可以通过食用小于或等于它们的数字而改变,在吃完一个数字之后,较大的数字将增长1,而较小的数字消失。

函数检查提供列表中的所有数字,所以如果你有27,9, 11 , 10 ,8并且你的目标是12,那么函数应该返回3,因为11可以吃10,10可以吃9,8可以吃12,9可以吃8,然后它现在可以吃10,然后11可以吃12。

我的问题是,当目标4提供了3,3,3,2,2,2,1,1这样的值时,我的函数返回错误的值(值应该是9)。由于某些原因,我的函数不识别与可以被吃掉的数字相等的数字,即使在if语句中有一个">=“。

代码语言:javascript
复制
def cannibal(l, target):

     try:
         l = l.split(",")
         l.sort(reverse = True)
         l = list(map(int, l))
         print (l)

     except:
         l.sort(reverse = True)
         print (l)

     finally:

         eatingl = l[:]
         count = 0
         flag = True


         for i in range(0,len(l)-1):

             if l[i] > target:
                 print (l[i],"got skipped at",i)
                 continue

             if l[i] == target:
                 print (l[i],"at",i,"got added")
                 count += 1
                 continue

             if l[i] < target:

                 while flag:

                     if eatingl[i] < target and len(eatingl) == 1:
                         flag = False
                         break

                     if eatingl[i] == target:
                             (eatingl[i],"at",i,"got added")
                             count +=1
                             flag = False
                             break

                     for j in range(0,len(eatingl)):


                         if eatingl[i] == eatingl[j]:
                             continue

                         print (eatingl[i],eatingl[j])


                         if eatingl[i] >= eatingl[j]:
                             print (eatingl[i],"is eating",eatingl[j])
                             eatingl.remove(eatingl[j])
                             eatingl[i] += 1
                             break

                         if eatingl[i] > target:
                             flag = False
                             break



         print (count)
         return count
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-31 20:11:46

我的函数不识别等于数字的数字,即使在if语句中有一个">=“,也可以吃掉它。

在您的代码中只有一个>=,并且在此之上不远的是:

代码语言:javascript
复制
                         if eatingl[i] == eatingl[j]:
                             continue

这一行阻止一个数字吃等号。你想让这条线阻止一个号码自己吃吗?如果是这样,则需要上面的条件为if i == j:

但是,您的代码还有其他一些问题:

一旦找到一个可以到达目标的数字,

  • 就需要重新设置下一个号码的列表。您已经有了一个行eatingl = l[:]来完成这个任务,但是它在for i in ...循环之外。将它移动到inside.
  • Secondly,行下面,if eatingl[i] == target:,您有下面的行。

(吃里,"at",i,"got“)

这将一个包含四个项目的元组组合在一起,然后扔掉它,因为它没有做任何事情。我猜您缺少了一个here.

  • Thirdly,变量--在print循环开始之前,变量flag设置为True。一旦这个变量被设置为Falsewhile循环就不会再被输入,所以您的程序将永远不会找到一个以上的食人号。相反,将行flag = True移到while循环的正上方。

  • 下一步,当一个数字被吃掉时,您将它从list eatingl中删除。这在j > i时不会造成问题,但在j < i时会造成问题,因为删除索引j处的数字会将索引i处的数字移动到索引i - 1,然后在索引i处增加数字,这可能是一个不同的数字。

添加到正在迭代的列表中或从列表中删除项通常会导致问题。与删除数字不同,用占位符值(如0-1None )替换数字更为简单。您需要确保不尝试吃一个已经被吃掉的数字,并且可以通过在检查eatingl[i] >= eatingl[j].

  • If程序是否到达j循环的末尾而不使用break之前检查eatingl[j]不是占位符来做到这一点,这样eatingl[i]就没有足够的其他数字可以到达目标。在这种情况下,您可能希望break退出while循环。最简单的方法是将else子句添加到for循环中:

其他:print(“不能再为”,eatingli)标志=假中断

上面的else行应该与for j in ...行对齐。一个break.

  • Finally,循环可以有一个else块,如果for循环中的代码不应该是for i in range(0,len(l)):而不是for i in range(0,len(l)-1):,那么else块中的代码就会运行。如果您有一个唯一最小的数字,就像在您的示例27,9,11,10,8中一样,这不是一个问题:一个唯一的最小数字不能吃掉任何其他数字,所以跳过它不会有任何害处。但是在你的例子中,3,3,3,2,2,2,1,1,其中最小的数是1,其中有三个,每个1都可以吃掉另外两个1,然后2变成4。

我对您的代码做了这些更改,它给了我预期的输出。

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

https://stackoverflow.com/questions/62120762

复制
相关文章

相似问题

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