劍指offer - 題46~48(約瑟夫環,遞歸求和,位運算)

孩子們的遊戲(圓圈中最後剩下的數)
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章