每周挑战210
首先,感谢穆罕默德。上周末是为我们提供每周挑战的四周年。我敢肯定,我为普华永道团队的所有代言都表示,他的不懈的工作非常感谢。
abaoqian1,My solutions
任务1:销毁和胜利
任务
您获得了整数列表。
写一个脚本以获取最大点。您被允许取出(销毁)任何整数并从列表中删除。但是,如果您这样做,那么所有整数恰好一个不到一个或一摩尔的整数也将被删除。找出已删除整数的总数。
我的解决方案
这看起来相对直截了当。我要做的第一件事是通过唯一数字列表进行迭代,从而为此提供了可变的i
。在Python中,这是通过将列表转换为集合来完成的。一组 - 从定义上 - 不能具有重复的数字。在perl中,我从列表中使用uniq函数:: util。
对于每次迭代,我得到了i-1
和i+1
之间的所有值的总和。在Python中,我们使用for ... if
方法来做到这一点。在Perl中,我们可以使用grep函数。为了计算总和,python具有一个总和函数,而perl使用list :: util。
一旦计算了此迭代的分数,我将设置score
值高于当前值。最后,我将分数打印为输出。
例子
$ ./ch-1.py 2 3 1
6
$ ./ch-1.py 1 1 2 2 2 3
11
任务2:数字碰撞
任务
您将获得一个整数数组,如果负面时,它可以向正确的方向移动,而在负面时向左方向。如果两个数字相撞,则较小的数字将爆炸。如果两者都相同,那么它们都爆炸了。比较时,我们考虑的绝对值。
所有数字以相同的速度移动,因此,任何2个数字沿相同方向移动永远不会碰撞。
写一个脚本以找出谁在碰撞中幸存下来。
我的解决方案
这是我对其他人如何处理它的真正感兴趣的任务之一。我确实考虑了如何在一次通过中执行此操作,但最终得到了可能不是最有效但可能更可读的解决方案。
对于此任务,我有两个循环。当should_continue
设置为TRUE时,外循环继续进行。内部循环迭代从零迭代到2个阵列的长度,设置变量i
。
对于每次迭代,我将变量left
设置为该位置的值,而right
为下一个值设置。如果左侧是正面的,右为负,我们会发生碰撞。进行绝对比较,如果right
不大,我将其删除。如果left
不大,我将其删除。然后,我从内部循环中折断,以便再次调用外循环。
如果我到达内部循环的末端,我将should_continue
设置为false,并且外循环也将进入。在python中,一个for loop可以具有另一个块,只有在循环未中断时才会调用(例如,使用break
语句)。
我的perl解决方案相似,除了我可以直接从内部循环跳到外循环,因此不需要should_continue
变量。
例子
$ ./ch-2.py 2 3 -1
[2, 3]
$ ./ch-2.py 3 2 -4
[-4]
$ ./ch-2.py 1 -1
[]