前几天在网上看到一道题目:将54张扑克牌按照某种次序进行排列,然后取出第一张放至底部,然后将现在的第一张翻开拿出来,不断循环,直至手中没有扑克牌,而且拿出扑克牌的顺序依次是红心A-K、方片A-K、黑桃A-K、梅花A-K、大王、小王。
这道题目让我想起了小时候老爸给我出的题目,取一幅扑克牌同花色的A-K,以某种顺序排列后,取第一张放至最后,翻开现在的第一张,依次循环,使翻开的牌面依次为A-K。这两个问题有着异曲同工之妙。
所以我就想到用程序来实现它
下面是代码(Python3):
import math
def test(n):
res = [0 for i in range(n)]
num = 0
count = 1
c = int(math.log2(n))+1
for i in range(c):
for j in range(n):
if res[j] == 0:
num += 1
if num % 2 == 0:
res[j] = count
count += 1
for i in range(n):
if res[i] == 0:
res[i] = count
return res
代码的思想也非常简单,就是隔一个输入一个。
测试:
print(test(13))
输出:
[7, 1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10]
验证正确。
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
新增于2018年9月28日
在网上看到另一种解法,是微软员工提出来的
具体做法就是将n个数目按从小到大排列,然后按照上面的步骤,把第一个数字放最后,输出第二个数字,循环得到这n个数字的输出顺序,这时将输出顺序和输出序列的索引值互换,将得到的新序列按输出序列的数字进行排序就得到了要的结果。就拿给网友的例子n=5举例,将[1,2,3,4,5]
按照执行步骤一次输出,得到输出序列[2,4,1,5,3]
,将这个输出序列和该序列的索引值互换并按照输出序列的值进行排序,得到[3,1,5,2,4]
经验证,这就是n=5时想要的结果。
代码实现如下:(Python3)
def test2(n):
a = [i+1 for i in range(n)]
res = []
while(a):
if len(a) == 1:
res.append(a[0])
break
res.append(a[1])
a = a[2:] + [a[0]]
res = [[res[i], i+1] for i in range(len(res))]
res.sort()
return [res[i][1] for i in range(len(res))]
代码测试正确!