1. 程式人生 > >劍指offer系列(十六)翻轉單詞順序列,撲克牌順子,孩子們的遊戲(圓圈中最後剩下的數)

劍指offer系列(十六)翻轉單詞順序列,撲克牌順子,孩子們的遊戲(圓圈中最後剩下的數)

翻轉單詞順序列

題目描述

牛客最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?

解題思路:

法一:以空格為界,提取單一字元,然後用切片逆置排順序

法二:reverse函式,把輸入字串完全翻轉。從前往後依次遍歷新字串,遇到空格把空格前字串用reverse函式翻轉,新增空格,繼續遍歷。如果新字串結尾不是空格,前一個空格到結尾字串沒有翻轉,因此記得跳出遍歷後,再完成一次翻轉。

eg: student. a am I
      I ma a .tneduts
      I                       pEnd = ' ',首先讓空格前面的字元進行翻轉,然後 pStart = pEnd
        am                 pStart = ' ',兩個指標都向前進到a位,下一次pEnd繼續向前進到空格為止,然後ma翻轉變成am
             a
                 student.      同理

程式碼:

法一:

# -*- coding:utf-8 -*-
class Solution:
    def ReverseSentence(self, s):
        # write code here
        if s== None or len(s)<0:
            return ''
        return ' '.join(s.split(' ')[::-1])

法二:

# -*- coding:utf-8 -*-
class Solution:
    def ReverseSentence(self, s):
        # write code here
        if s==None or len(s)<=0:
            return ''
        s = list(s)
        s = self.Reverse(s)
        pStart = 0
        pEnd = 0
        listTemp = []
        result = ''

        while pEnd<len(s):
            if pEnd == len(s)-1:
                listTemp.append(self.Reverse(s[pStart:]))
                break
            if s[pStart] == '':
                pStart += 1
                pEnd += 1
                listTemp.append(' ')
            elif s[pEnd]==" ":
                listTemp.append(self.Reverse(s[pStart:pEnd]))
                pStart = pEnd
            else:
                pEnd += 1
        for i in listTemp :
            result += ''.join(i)
        return result
    
    def Reverse(self, s):
        start = 0
        end = len(s)-1
        while start<end:
            s[start], s[end] = s[end],s[start]
            start+=1
            end-=1
        return s
            

撲克牌順子

題目描述

LL今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王(一副牌原本是54張^_^)...他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!!“紅心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是順子.....LL不高興了,他想了想,決定大\小 王可以看成任何數字,並且A看作1,J為11,Q為12,K為13。上面的5張牌就可以變成“1,2,3,4,5”(大小王分別看作2和4),“So Lucky!”。LL決定去買體育彩票啦。 現在,要求你使用這幅牌模擬上面的過程,然後告訴我們LL的運氣如何, 如果牌能組成順子就輸出true,否則就輸出false。為了方便起見,你可以認為大小王是0。

解題思路:

先統計王的數量,再把牌排序,如果後面一個數比前面一個數大於1以上,那麼中間的差值就必須用王來補了。
看王的數量夠不夠,如果夠就返回true,否則返回false。

程式碼:

# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        # write code here
        if not numbers:
            return False
        numbers.sort()
        zero = numbers.count(0)
        
        for i,v in enumerate(numbers[:-1]):
            print i,v
            if v!=0:
                #numbers兩個數不能相同
                if numbers[i+1]==v:
                    return False
                zero = zero-(numbers[i+1]-v-1)#numbers序列前後還差幾個數字可以補成序列
                if zero<0:
                    return False
        return True
                
                

孩子們的遊戲(圓圈中最後剩下的數)

題目描述

每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的:首先,讓小朋友們圍成一個大圈。然後,他隨機指定一個數m,讓編號為0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,從他的下一個小朋友開始,繼續0...m-1報數....這樣下去....直到剩下最後一個小朋友,可以不用表演,並且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!^_^)。請你試著想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)

解題思路:

約瑟夫環問題

遞推公式:f[i] = (f[i-1]+m)%i

參考:https://blog.csdn.net/u012505432/article/details/51747181

程式碼:

# -*- coding:utf-8 -*-
class Solution:
    def LastRemaining_Solution(self, n, m):
        # write code here
        if n<1 and m<1:
            return -1
        temp = 0
        for i in range(1,n+1):
            temp = (temp+m)%i
        return temp