剑指offer 面试题60 python版+解析:n个骰子的点数

题目描述:

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值的出现概率。

思路:定义两个数组。数组的长度为6*n,即可能出现的最大和。数组每个元素的值代表出现的次数,比如probability[5]表示点数和为5出现的次数。在一轮循环中,一个数组记录之前一次所有出现的情况,一个数组记录这一次的所有出现的情况。例如这一次出现和为n的次数,应该等于另一个数组里记录的n-1,n-2, n-3, n-4, n-5, n-6的和。

class Solution:
    # @param {int} n an integer
    # @return {tuple[]} a list of tuple(sum, probability)
    def dicesSum(self, n):
        # Write your code here
        if  n<1:
            return []
        probability = []
        probability.append([0]*(6*n+1))
        probability.append([0]*(6*n+1))
        flag = 0
        ratio = []
        for i in range(1,7):
            probability[flag][i]=1 
        
        for k in range(2, n+1):
            for i in range(0, k):
                probability[1-flag][i]=0
            for i in range(k, 6*k+1):
                probability[1-flag][i] = 0
                for j in range(1, min(i+1,7)):
                    probability[1-flag][i] += probability[flag][i-j]
                   
            flag = 1-flag
            
        
        total = pow(6,n)
        for i in range(n, 6*n+1):
            ratio.append([i, probability[flag][i]/total])
        return ratio

 

你可能感兴趣的:(剑指offer)