leetcode刷題--Count and Say

黃思喆發表於2015-05-13

題目:輸入一個階數n,輸出一個該階對應的字串s。這個字串由上一介輸出的字串處理得到。具體規則是:n=1時輸出字串1;n=2時,數上次字串中的數值個數,因為上次字串有1個1,所以輸出11;n=3時,由於上次字元是11,有2個1,所以輸出21;n=4時,由於上次字串是21,有1個2和1個1,所以輸出1211。依次類推。

這道題依然難度是easy,陷阱在於不是求不同數字字元出現的次數,而是求連續相同字元的出現次數。解題可以用遞迴的思路來寫,不過我沒修改過,不是尾遞迴的形式(python反正也沒有尾遞迴優化)。

思路如下:

  • 遞迴思路:當n=1時返回字串“1”,其他呼叫前一階的返回字串形成遞迴

  • 求連續相同字元出現次數:基本是C語言的思路--設定計數器count和臨時變數same,same儲存當前計數的數字,count記錄當前數字的重複次數。噹噹前計數的數字與same不同時更新結果字串。更新same的值,count值歸位。

  • 需要注意開頭和結尾處的處理

程式碼如下:

class Solution:
    # @param {integer} n
    # @return {string}
    def cands(self,n):
        if n==1:
            st="1"
            return st
        else:
            st=self.cands(n-1)
            count=1
            same=''
            se=''
            for i in range(len(st)):
                if same!=st[i]:
                    if same !='':
                        se+=str(count)
                        se+=same
                    same=st[i]
                    count=1
                else:
                    count+=1
            se+=str(count)
            se+=same
            return se
    def countAndSay(self, n):

        return self.cands(n)

ps:不要吐槽python寫的像C啦。。。以後想起來更好的方法會更新噠

相關文章