python循环报数游戏_python经典面试题之一:猴子报数
在與python相關的面試中,很經常能看到這樣類似的一道題:
有13只猴子圍成一圈,編號分別為1~13,從1開始報數,報到10之后,下一個猴子又重新由1報起,每逢報到7的猴子出局,請設計程序,求得最終留下來的那一只猴子的編號。
以前,我的解法是老老實實地寫幾個循環嵌套,不過其實有更加省事的辦法:使用字典!
以字典的鍵(int類型的1-13)作為猴子的編號,以他們對應的鍵值作為猴子當前的狀態(報到幾號數或者是已出局),定義字典的時候可以設置一個初值給它們。然后,設報數號為1,通過輪巡1-13號猴子進行報數,已出局的猴子跳過,未出局的猴子報數,報完判斷當前猴子報的是否為7,是則將該猴子的狀態設置為出局,然后報數號繼續+1,到10之后又重置為1,猴子號數也是,報到13號猴子以后重置為1號猴子。最后通過判斷是否已經有12只猴子出局,即可結束該循環。
代碼如下:
monkey = {i + 1: "" for i in range(13)}
callnumber = 1
try:
while True:
for m in range(1, 14):
if monkey[m] != "out":
monkey[m] = callnumber
if callnumber == 7: monkey[m] = "out"
callnumber += 1
if callnumber > 10: callnumber = 1
if list(monkey.values()).count("out") == 12: raise TypeError
except:
[print("\nmonkey:{} is win".format(k)) for k, v in monkey.items() if v != "out"]
這里我還是用了兩層循環,通過try...except加raise Error來一次性打破多重循環,實際上也可以做成一層循環,只做while True的就可以,里面的for循環可以自建一個循環計數器變量來替代掉。
也有使用列表的做法,當然,上一篇文章提到了高手通過極限縮減代碼行數來秀技能,那在這個場景也是可以這樣玩的
status = [[0 for i in range(13)], 1, 0]
while 1:
if status[0][status[2]] != -1:
status[0][status[2]] = status[1]
if status[1] == 7: status[0][status[2]] = -1
status[1] += 1
if status[1] > 10: status[1] = 1
if status[0].count(-1) == 12: break
status[2] += 1
if status[2] == len(status[0]): status[2] = 0
[print("monkey:{} is win".format(index + 1)) for index, k in enumerate(status[0]) if k != -1]
這段代碼讓人難受的地方在于,你要是不將status[0],status[1],status[2]替換成別的變量,你需要花費超級多的經歷去看懂這段代碼,玩兒嘛,哈哈哈!僅供參考,不喜勿噴~
總結
以上是生活随笔為你收集整理的python循环报数游戏_python经典面试题之一:猴子报数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中字符串有什么组成_pyth
- 下一篇: yum安装mysql驱动_centos7