孩子們的遊戲(圓圈中最後剩下的數)
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作爲牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的:首先,讓小朋友們圍成一個大圈。然後,他隨機指定一個數m,讓編號爲0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,從他的下一個小朋友開始,繼續0…m-1報數…這樣下去…直到剩下最後一個小朋友,可以不用表演,並且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!_)。請你試着想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)
如果沒有小朋友,請返回-1
# -*- coding:utf-8 -*-
class Solution:
def LastRemaining_Solution(self, n, m):
# write code here
if n==0:
return -1
# 參考zhihu:@葛溪驛對約瑟夫環的解釋:
'''
當有n個人的時候,他們的編號依次是0、1、2、3、4、………、n-1。
假設最後編號爲x(n)的人會留下來。
因爲數到m的那個人會出列,那麼此輪中編號爲(m-1)%n的人會出列,編號爲(m+0)%n的人將做爲下一輪編號爲0的人,此輪編號爲(m+i)%n的人將做爲下一輪編號爲i的人…
因此當有n-1個人的時候,編號爲i的人對應着上一輪編號爲(m+i)%n的人。
假設此輪編號爲x(n-1)的人最終會留下來。因爲編號爲x(n-1)的人肯定對應着上一輪的x(n),所以有x(n)=(m+x(n-1))%n。
有了這個遞推公式,那我們就可以一直遞推到x(2)=(m+x(1))%2,而x(1)=0。
'''
result=0
i=2
while i<=n:
result=(m+result)%i
i+=1
return result
求1+2+…+n
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。
# -*- coding:utf-8 -*-
class Solution:
def Sum_Solution(self, n):
# write code here
# 遞歸:
# 注意此處 n and 要放在self.Sum_Solution(n-1)之前,不然會報錯
return n+(n and self.Sum_Solution(n-1))
不用加減乘除做加法
寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算符號。
思路來源@牛客網Callllll
# -*- coding:utf-8 -*-
class Solution:
def Add(self, num1, num2):
# write code here
# 位運算:
while num2:
# 0x7FFFFFFF:最大整數,0xFFFFFFFF:-1
num1, num2 = (num1^num2) & 0xFFFFFFFF, ((num1 & num2) << 1) & 0xFFFFFFFF
# ~:逐位取反
return num1 if num1 <= 0x7FFFFFFF else ~(num1 ^ 0xFFFFFFFF)