1.随机数生成器
假设你已经有一个随机数生成器,能够以概率p生成0,概率1-p生成1,请问如何设计算法以概率q等概率地生成0-6这七个数字中的一个?即每个数字的概率均为q,q<1/7.
1.实现shuffle
(1)复制数组
事先将origin复制到一个额外数组array中,每次随机取array中某个值,并且将其丢弃
时间复杂度:N*N,因为list的remove操作是O(N)的
(2)原地法
交换array内部的元素,每次迭代中,随机产生[当前索引,n]之间的数字
class Solution:
def __init__(self, nums):
self.origin = nums
self.array=list(nums)
def reset(self):
"""
Resets the array to its original configuration and return it.
"""
self.array=list(self.origin)
return self.origin
def shuffle(self):
"""
Returns a random shuffling of the array.
"""
n = len(self.array)
for i in range(n):
random_index = random.randrange(i, n)
self.array[i], self.array[random_index] = self.array[random_index],self.array[i]
return self.array
2.汉诺塔
圆盘数 最小移动次数
1个圆盘:1次
2个圆盘:3次
3个圆盘:7次
N个圆盘:2^N-1次
第N个圆盘移动次数:1
第N-1个圆盘移动次数:2
第N-2个圆盘移动次数:4
第N-3个圆盘移动次数:8
第1个圆盘移动次数:2^(N-1)
总和是:1+2+4+...+2^(N-1)=2^N-1
def move(n,a,buffer,c):
if n==1:
print(a,"->",c)
return
move(n-1,a,c,buffer)
move(1,a,buffer,c)
move(n-1,buffer,a,c)
move(3,'a','b','c')