Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在给定k和特定条件的比赛中配对数字_Python_Algorithm_Data Structures_Nested Loops - Fatal编程技术网

Python 如何在给定k和特定条件的比赛中配对数字

Python 如何在给定k和特定条件的比赛中配对数字,python,algorithm,data-structures,nested-loops,Python,Algorithm,Data Structures,Nested Loops,面试时有人问我。我没有做笔记,所以问题描述可能有点模糊 数字是锦标赛中的排名 k=1, return (1, 2) k=2, return ((1, 4), (2, 3)) k=3, return (((1, 8), (4, 5)), ((2, 7), (3, 6))) k=4, return ((((1, 16), (8, 9)), ((4, 13), (5, 12))), (((2, 15), (7, 10)), (3, 14), (6, 11)))) 最小等级应始终与最大等级配对。例

面试时有人问我。我没有做笔记,所以问题描述可能有点模糊

数字是锦标赛中的排名

k=1, return (1, 2) 
k=2, return ((1, 4), (2, 3)) 
k=3, return (((1, 8), (4, 5)), ((2, 7), (3, 6)))
k=4, return ((((1, 16), (8, 9)), ((4, 13), (5, 12))), (((2, 15), (7, 10)), (3, 14), (6, 11))))
最小等级应始终与最大等级配对。例如,
k=3(((1,8),(4,5)),((2,7),(3,6))->((1,4),(2,3))->(1,2)->1(获胜者)

我认为暴力解决方案是创建一个给定k的数字列表,并通过增加左右索引在最大数字和最小数字之间配对。但一旦配对完成,我应该能够进一步配对。例如,当k=3时,我可以创建一个列表:
[1,2,3,4,5,6,7,8]
并创建一个对列表:
[(1,8)、(2,7)、(3,6)、(4,5)]
。在那之后,我应该能够再次配对到这个:
[((1,8),(4,5)),((2,7),(3,6))]

在我把两个数字配对后,我不能想出一个嵌套的配对规则,它可以应用于任何给定的k数

编辑:给出了K。使用k,您可以创建一个从1到2**k的数字列表。因此,如果k=3,一个数字列表将是[1,2,3,4,5,6,7,8]。正如我上面提到的,这个数字代表一个等级。所以“1”是锦标赛后的赢家。由于“1”是赢家(最小的数字),“1”应该与“8”(底部的数字和最大的数字)配对。以及如下(2,7)、(3,6)、(4,5)。但既然这是一场锦标赛,你希望每对选手中都有一位胜利者再次比赛。因为条件是(第一小,第一大),(第二小,第二大)…,所以应该配对((1,8),(4,5))和((2,7),(3,6))。(1,8),(4,5))->(1,4),(2,7),(3,6))->(2,3)=>((1,4),(2,3))=>(1,2)=>1(获胜者)

该问题的目标是将给定k的数字(通过嵌套元组或列表)与特定条件(最小1,最大1),(最小2,最大2)配对


我尝试了蛮力解决方案,我想不出如何在给定k的嵌套循环中配对。我还想到了使用二叉树和递归方法,我应该知道如何将给定的k和特定的条件配对,这就是我无法前进的地方

哇,希望面试官能更好地解释问题陈述

也许这就是你想要的

def get_pairs(L):
    L = sorted(L)
    middle = len(L)//2
    result=list(zip(L[:middle],L[:middle-1:-1]))
    if len(result) > 2:
        return get_pairs(result)
    return result

print get_pairs(range(1,5)) #k=2 ???    
print get_pairs(range(1,9)) #k=3 ???
print get_pairs(range(1,17) #k=4 ???
啊哈,我想我算出来了(wtf k是什么,它是如何联系起来的)


几分钟前你刚刚问了同样的问题(你删除了这个问题),很快就获得了否决票并结束了投票。欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。然后在这里申请。等等,k=3是怎么工作的?你必须更精确。这看起来很棒。我没想过要用拉链。非常感谢乔兰·比斯利。一件事是,您不需要在get_pairs函数中进行排序,因为顺序保持不变。无论排序如何,结果都是相同的。仅当L已排序时。。。如果不是这样,它就不会工作。。。在我理解k是什么之前,我写了get_pairs,所以我不知道它是如何得到列表的
def get_pairs_for_rank(k):
    return get_pairs(range(1,2**k+1))