要使用偏移量k几乎完美地洗牌一副n张牌,请执行以下步骤:
例如:
n=11,k=3,起始甲板从底部开始:3 7 9 A 2 8 J k 6 4 Q
首先,我们在桩P上放置Q,然后放置4,然后放置6。
然后我们将剩下的卡分成下半部分:379A和上半部分:28JK.
B的底牌是3,我们把它放在P上,然后T的底牌是2
重复上一步,我们最终得到了洗牌牌组:q46332789jak.
您的任务是编写一个程序,对于给定的值n和k,该程序输出需要多少次近乎完美的洗牌才能将完全排序的数据组返回到其原始状态
示例输入1
6
0
示例输出14
示例输入2
11
3
示例输出210
约束条件
我在这个问题上困惑了很久,但我一直遇到问题
我该怎么解决这个问题
我的代码正在运行:
def shuffle(n, k):
global shuffledA, shuffledB, shuffledZ, cards
if 0 <= k <= n <= 1000000 and (n-k) % 2 == 0:
cards = []
shuffled = [None]
shuffledA = []
shuffledB = []
shuffledZ = []
num = 1
for i in range(1, n+1):
cards.append(i)
shuffledZ = cards[n-1-k:n-1]
shuffledA = cards[0:(n-k)/2-1]
shuffledB = cards[(n-k)/2:n-k-2]
当我在n-k为偶数的情况下运行时,它总是输出此错误:
>>> shuffle(11, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "main.py", line 256, in shuffle
shuffledA = cards[0:(n-k)/2-1]
TypeError: slice indices must be integers or None or have an __index__ method
回答这个问题有两种方法-第二种方法效率更高,因为它速度更快,这就是为什么它在Perse编码挑战中获得满分的原因
第一种(效率较低的)方法
就是创建一个虚拟牌组,然后虚拟地洗牌。这是可行的,但对于较大的值n(例如1000000),这可能会很慢,因此在将其作为答案提交时会导致超时。我的代码如下:
更高效、更省时的方法
就是找到每张牌洗牌背后的数学模式
每次洗牌,最后一张牌总是第一张牌,最后一张牌总是第二张牌。。。最后一个总是第n个
甲板的其余部分一分为二
当您沿着阵列中单个元素(牌组中的一张牌)的路径移动时,您可能会注意到,它可能会在相同的位置循环,例如,在位置2、4、5、0找到的牌,然后返回到2
每张卡都有自己的“循环”序列。想象一个牌组,位置1的牌X到2,然后是3,然后是1,位置4的牌Y到5,6,7,然后是4。经过3个循环后,卡A返回其起点。4个循环后,卡Y返回其起点。因此,两张牌要同时回到起始点,我们需要12次洗牌。这是因为12是3和4的最低公倍数
基本上,您需要找到所有卡的所有“循环”长度的最小公倍数
代码可以在here中找到,但我还是复制并粘贴到了下面
相关问题 更多 >
编程相关推荐