劍指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