一道逻辑题

前几天在网上看到一道题目:将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))]

代码测试正确!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值