九章算法面试题38 洗牌的技巧
2015-05-12 14:52
218 查看
九章算法官网-原文网址
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是最小公倍数的意思。于是算法为,根据一次洗牌的结果,找到所有的循环节,答案为所有循环节长度的最小公倍数。
面试官角度
这个题目的考察点在于找规律。不过如果有一定置换群的理论基础的同学,是可以比较轻松的解决这个问题的。有兴趣的同学可以查看离散数学的相关书籍中置换群的知识点。相关文章推荐
- lintcode&九章算法——Microsoft 面试题 | 我能赢 ? 待解决
- 九章算法面试题78 有效回文串
- 面试题之九章算法 字符串编辑距离
- 九章算法面试题14 超过一半的数
- 九章算法面试题26 方格取数
- 九章算法面试题44 设计一个Web Crawler
- 九章算法面试题60 爬楼梯
- 九章算法面试题6 负载均衡
- 九章算法面试题45 寻找最大的储水容器
- 九章算法面试题61 克隆图
- 九章算法面试题77 插入区间
- 九章算法面试题15 字符串编辑距离
- 九章算法面试题27 最大连续子集
- 九章算法面试题41 判断单词的包含关系
- 九章算法面试题46 正负交替
- 九章算法面试题62 合并k个排序数组
- 程序员面试题精选100题(38)-输出1到最大的N位数[算法]
- 九章算法面试题71 平方根
- 3295 落单的数 九章算法面试题
- lintcode&九章算法——Google面试题:原子计数