一道腾讯 WXG 面试题

Posted 夏夕空~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道腾讯 WXG 面试题相关的知识,希望对你有一定的参考价值。

问题:两块广告牌,五个广告商,设计一个算法,在一段时间内五个广告商的广告出现次数为1:2:3:4:5,注意两个广告牌不能同时播同一个广告。

考虑只有一个广告牌,则只需要按照以下概率选择对应的广告播放即可
P = [ 1 15 ,   2 15 ,   3 15 ,   4 15 ,   5 15 ] P=[\\frac{1}{15},\\ \\frac{2}{15},\\ \\frac{3}{15},\\ \\frac{4}{15},\\ \\frac{5}{15}] P=[151, 152, 153, 154, 155]
具体实现是通过轮盘赌算法,即产生一个[0, 1)区间上的随机数 r r r,根据 r r r落在累积概率区间的位置选择对应的广告。累积概率为
P c u m s u m = [ 1 15 ,   3 15 ,   6 15 ,   10 15 ,   15 15 ] P_{cumsum}=[\\frac{1}{15} ,\\ \\frac{3}{15} ,\\ \\frac{6}{15} ,\\ \\frac{10}{15},\\ \\frac{15}{15}] Pcumsum=[151, 153, 156, 1510, 1515]
r ≤ 1 15 r\\leq\\frac{1}{15} r151,则选择第1个广告;若 1 15 < r ≤ 3 15 \\frac{1}{15}<r\\leq \\frac{3}{15} 151<r153,则选择第2个广告;以此类推…
相应的实现代码为

from random import random

N = 1000000
cnt_dict = {'1':0, '2':0, '3':0, '4':0, '5':0}

for i in range(N):
    r = random()
    if r<1/15:
        cnt_dict['1'] += 1
    elif r<3/15:
        cnt_dict['2'] += 1
    elif r<6/15:
        cnt_dict['3'] += 1
    elif r<10/15:
        cnt_dict['4'] += 1
    else:
        cnt_dict['5'] += 1

prob = [float('{:.3f}'.format(ele/sum(cnt_dict.values()))) for ele in cnt_dict.values()]
prob_required = [float('{:.3f}'.format(i/15)) for i in range(1,6)]

print(prob_required)
print(prob)

现在考虑有2个广告牌的情况,若没有2个广告牌不能同时播放同一广告这一限制,那么只需要两个广告牌相互独立地进行上面的操作即可。但题目要求两个广告牌不能同时播放相同的广告,考虑让其中的一个广告牌按照上面的方法先选择一个广告播放,然后在剩下的广告中按照某种概率选择出一个在另外一个广告牌播放。一种实现方法是,若选择了广告1和4,则另外一个广告牌播放广告5;若选择了5,则以 2 5 \\frac{2}{5} 52的概率选择广告2在另一个广告牌播放,以 3 5 \\frac{3}{5} 53的概率选择广告3在另一个广告牌播放;若选择了广告2,则等概的选择1和4在另一广告牌播放,若选择了广告3,则选择广告4在另一广告牌播放。
具体实现如下

from random import random

N = 1000000
cnt_dict = {'1':0, '2':0, '3':0, '4':0, '5':0}

for i in range(N):
    r = random()
    if r<1/15:
        cnt_dict['1'] += 1
        cnt_dict['5'] += 1
    elif r<3/15:
        cnt_dict['2'] += 1
        if random()<1/2:
            cnt_dict['1'] += 1
        else:
            cnt_dict['4'] += 1
    elif r<6/15:
        cnt_dict['3'] += 1
        cnt_dict['4'] += 1
    elif r<10/15:
        cnt_dict['4'] += 1
        cnt_dict['5'] += 1
    else:
        cnt_dict['5'] += 1
        if random()<2/5:
            cnt_dict['2'] += 1
        else:
            cnt_dict['3'] += 1
            
prob = [float('{:.3f}'.format(ele/sum(cnt_dict.values()))) for ele in cnt_dict.values()]
prob_required = [float('{:.3f}'.format(i/15)) for i in range(1,6)]

print(prob_required)
print(prob)

以上是关于一道腾讯 WXG 面试题的主要内容,如果未能解决你的问题,请参考以下文章

一道腾讯 WXG 面试题

一道腾讯 WXG 面试题

转腾讯高级工程师:一道面试题引发的高并发性能调试思考

面试复盘-生活不就是起起落落落落落吗?

面试复盘-生活不就是起起落落落落落吗?

每天一道Leecode——寻找两个正序数组的中位数,腾讯高频面试题分享!