题目要求:
平时洗牌是两打牌,交叉洗在一起.
也就是开始 1 2 3 4 5 6 7 8
第一次 1 5 2 6 3 7 4 8
第二次 1 3 5 7 2 4 6 8
。。。
第k次 ...
给你一个数组a[2N],要求在O(1)的空间复杂度内给a[2N]k次洗牌.
解决方案:
首先寻找规律,有如下性质:
1> 最开始和最后的两张牌永远不变
2> 中间有2N-2张牌,即一张牌最多可能有2N-2种位置,这2N-2张牌一定是全动,即不可能存在两个状态,
它们的一部分相同,而另一部分不同。这条性质说明了洗牌会进入循环,并且循环节最大为2N-2。
3> 将除去1以后剩下的2N-1张牌看成是一个循环圈,就是说超出2N-1就从循环圈的开始数,那么,
第一次洗牌,2向后移动1个位置,3向后移动2个位置,……
第二次洗牌,2向后移动2个位置,3向后移动4个位置,……
……
第k次洗牌,2向后移动2^k - 1个位置,3向后移动2*(2^k-1)个位置,4向后移动3*(2^k-1)个位置……
2N-1向后移动(2N-2)*(2^k-1)个位置。