九章算法官网-原文网址
http://www.jiuzhang.com/problem/38/
题目
有一副扑克有2n张牌,用1,2,..2*n代表每一张牌,一次洗牌会把牌分成两堆,1,2..n和n+1...2n。然后再交叉的洗在一起:n+1, 1, n+2, 2, … n, 2n。问按照这种技巧洗牌,洗多少次能够洗回扑克最初的状态:1,2,...2n。
解答
以1 2 3 4 5 6为例,洗一次之后为4 1 5 2 6 3 。将两排数组对比看:
1 2 3 4 5 6
4 1 5 2 6 3
数字1的下面是4,代表每一次洗牌后1这个位置的数会被4这个位置的数替代,接着看数字4,4下面是2,代表每一次洗牌后4这个位置的数会被2替代,再看2,2下面是1,2这个位置的数字会被1替代。此时,1 4 2形成一个环,代表这三个位置上的数再每一次洗牌后,循环交替,并且在洗3次以后,各自回到最初的位置。用同样的方法可以找到3 5 6是一个循环,循环节长度为3。由此可以知道,在经过了LCM(3,3)=3次洗牌后,所有数都回到原位,这里LCM是最小公倍数的意思。于是算法为,根据一次洗牌的结果,找到所有的循环节,答案为所有循环节长度的最小公倍数。
面试官角度
这个题目的考察点在于找规律。不过如果有一定置换群的理论基础的同学,是可以比较轻松的解决这个问题的。有兴趣的同学可以查看离散数学的相关书籍中置换群的知识点。
时间: 2024-10-03 20:17:29