Hulu 2020年校招-算法题《Hulu杀》Python
已經(jīng)工作了,義務(wù)支援下一屆,哈哈,好久不刷題還真有點(diǎn)生疏。Hulu今年秋招的題目并不難,一共四個(gè)編程題,基本是在常規(guī)問(wèn)題上的延伸。今天先整理第一個(gè)題目,其他題目后面有時(shí)間繼續(xù)整理。
問(wèn)題描述:
Hulu殺有 n 個(gè)葫蘆娃一起玩Hulu殺,他們被分為好人和壞人兩個(gè)陣營(yíng),打亂之后圍成一個(gè)圈,按照順時(shí)針序編號(hào)為 0~n-1 。然后隨機(jī)選定一個(gè)葫蘆娃,從他/她開(kāi)始由1到m順時(shí)針報(bào)數(shù),數(shù)到m的人被殺,下一個(gè)人繼續(xù)從1報(bào)數(shù),如此循環(huán)直到剩下最后一個(gè)人,這個(gè)人所屬陣營(yíng)獲得勝利。我們用一個(gè)整型數(shù)組a[i]=1表示i是好人,a[i]=0表示i是壞人;整型數(shù)組w[i]表示玩家i被選為起始位置的權(quán)重,即玩家i有w[i]/sum(w[i])的概率做起始位置。求好人獲勝的概率,四舍五入到小數(shù)點(diǎn)后五位數(shù)字(不足五位需要補(bǔ)零)
示例 1:
輸入:
輸出:
# 輸出一個(gè)浮點(diǎn)數(shù),表示好人獲勝的概率 ------------------------------------------- 0.50000問(wèn)題分析:
很顯然,這是一個(gè)經(jīng)典的約瑟夫環(huán)問(wèn)題的延伸,只要在約瑟夫環(huán)問(wèn)題求解基礎(chǔ)上,加上一層映射關(guān)系即可得出答案。具體思路如下:
(1)先求出以第一個(gè)人開(kāi)始,最后剩下的人(也就是約瑟夫環(huán)求解)
(2)在(1)的基礎(chǔ)上求出每個(gè)起始位置,最后剩下的人(人)
(3)在(2)的基礎(chǔ)上求出每個(gè)起始位置對(duì)應(yīng)的是好人獲勝還是壞人獲勝
(4)在(3)的基礎(chǔ)上求出每個(gè)起始位置對(duì)應(yīng)的好人獲勝的概率(權(quán)重求和即可),然后計(jì)算:好人獲勝的概率(權(quán)重) / 總的概率(權(quán)重)即可得出答案。
注意: 輸出要求應(yīng)該是字符串
Python實(shí)現(xiàn) AC:
# ============================================================= # !/usr/bin/python # -*- coding=utf-8 -*- # Name: HuluKill # Description: Hulu 2020年校招 筆試題(1) -- Hulu殺 # Author: yinxing # Date: 2019-09-05 19:00 # =============================================================class HuluKill:def JosephRing(self, n, m):"""約瑟夫環(huán)問(wèn)題求解:param n: n 個(gè)人(0, 1, 2 ... n-1):param m: 每 m 人出列:return: 最后剩下的那個(gè)人索引"""if n < 1 or m < 1: return -1last = 0for i in range(2, n+1):last = (last + m) % ireturn lastdef Solution(self, n, m, a, w):"""獲取Hulu殺的解:param n: n 個(gè)人(0, 1, 2 ... n-1):param m: 每 m 人出列:param a: 好人,壞人列表:param w: 開(kāi)始的權(quán)重:return: 好人隊(duì)獲勝的概率(保留5位小數(shù))"""victory = self.JosephRing(n, m) # 獲取選擇第一個(gè)人開(kāi)始,最后剩下的人(索引)victorylist = [(victory+i) % n for i in range(n)] # 每個(gè)位置開(kāi)始,對(duì)應(yīng)獲勝的人peoplelist = [a[victorylist[i]] for i in range(n)] # 每個(gè)位置開(kāi)始,對(duì)應(yīng)勝利的人(好人,壞人)GoodPerson = sum([w[i] for i in range(n) if peoplelist[i] == 1]) # 好人獲勝的概率(權(quán)重)return '%.5f' % (GoodPerson/sum(w)) # 結(jié)果 = 好人獲勝的概率(權(quán)重) / 總的概率(權(quán)重)if __name__ == '__main__':hulukill = HuluKill()# n, m = map(int, input().split())# a = list(map(int, input().split()))# w = list(map(int, input().split()))n, m = 3, 2a = [0, 0, 1]w = [2, 1, 1]print(hulukill.Solution(n, m, a, w)) # 0.50000聲明: 總結(jié)學(xué)習(xí),有問(wèn)題或不當(dāng)之處,可以批評(píng)指正哦,謝謝。
總結(jié)
以上是生活随笔為你收集整理的Hulu 2020年校招-算法题《Hulu杀》Python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vs2019无法启动程序 系统找不到指定
- 下一篇: python中系统找不到指定文件怎么办_