每周挑战213
abaoqian1,My solution
任务1:乐趣排序
任务
您有一个正整数列表。
编写一个脚本以先整理所有整数,然后在上升顺序中所有几率
我的解决方案
这是相对直接的。经验丰富的开发人员可能会首先对所有偶数数字进行排序,然后再整理所有奇数,这将是该任务的完全可接受的解决方案。
但是,我们知道Perl和Python都允许我们使用自定义排序方法。在Perl中,这表示为{ $a % 2 <=> $b % 2 || $a <=> $b }
。 $a
和$b
是sort函数实现此目标的全局变量。 <=>
提供了两个值之间的数值比较,如果$b
更大,则返回1
,如果$a
更大,则-1
或0
如果它们是相同的。
python的lambda功能更加直接。这里使用的语法是array.sort(key=lambda x: (x % 2, x))
,这意味着我们首先按均匀搜索(首先evens),然后是数值。
例子
$ ./ch-1.py 1 2 3 4 5 6
2, 4, 6, 1, 3, 5
$ ./ch-1.py 1 2
2, 1
$ ./ch-1.py 1
1
任务2:最短路线
任务
您将为您提供定义节点网络的双向路由的列表,以及源和目标节点号。
编写一个脚本以找到从最少的节点从源到目标的路由。
我的解决方案
另一方面,此任务要复杂得多。我只提交了Python解决方案。 perl解决方案将仅是它的音译。
首先要解析输入。第一个值是将JSON字符串转换为列表的列表,而第二值和第三值代表开始和结束数字。
i然后循环遍历节点中的每个数字,直到找到起点为止,可能有一个以上。对于每个起点,我将带有原始列表,起点和最终值的递归函数find_routers
调用。
find_routers
递归函数具有节点的原始列表,我们访问过的节点/位置对的列表以及目标编号。对于当前节点,我从当前数字向后移动,然后向前移动。对于每个新号码,我称为find_pairs
函数,以查看我们尚未看到的任何连接节点。对于每次发生的情况,我再次调用递归函数,将第二个值更新为我们已经看到的节点/位置对。
此功能的返回是节点/数字对的列表。我们跟踪到目前为止最短的解决方案的解决方案,并在当前的解决方案较短。
时进行更新。如果没有解决方案,我会打印-1
并退出。最后一步是将节点/位置对列表转换为数字列表,并显示新列表。
例子
$ ./ch-2.py "[[1,2,6], [5,6,7]]" 1 7
1,2,6,7
$ ./ch-2.py "[[1,2,3], [4,5,6]]" 2 5
-1
$ ./ch-2.py "[[1,2,3], [4,5,6], [3,8,9], [7,8]]" 1 7
1,2,3,8,7
$ ./ch-2.py '[[1,2,3,4,5,6,7], [7,1], [9,1]]' 6 9
6,7,1,9