标签:智力题 leetcode lintcode 九章算法 面试题
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是最小公倍数的意思。于是算法为,根据一次洗牌的结果,找到所有的循环节,答案为所有循环节长度的最小公倍数。
这个题目的考察点在于找规律。不过如果有一定置换群的理论基础的同学,是可以比较轻松的解决这个问题的。有兴趣的同学可以查看离散数学的相关书籍中置换群的知识点。
标签:智力题 leetcode lintcode 九章算法 面试题
原文地址:http://blog.csdn.net/jiuzhang_ninechapter/article/details/45669531