M$准备

111 阅读1分钟

1.随机数生成器

假设你已经有一个随机数生成器,能够以概率p生成0,概率1-p生成1,请问如何设计算法以概率q等概率地生成0-6这七个数字中的一个?即每个数字的概率均为q,q<1/7.

答案:blog.csdn.net/chfe007/art…

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')