1. 程式人生 > >LeetCode演算法題38:報數解析

LeetCode演算法題38:報數解析

報數序列是一個整數序列,按照其中的整數的順序進行報數,得到下一個數。其前五項如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被讀作 “one 1” (“一個一”) , 即 11。
11 被讀作 “two 1s” (“兩個一”), 即 21。
21 被讀作 “one 2”, “one 1” (“一個二” , “一個一”) , 即 1211。
給定一個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。
注意:整數順序將表示為一個字串。
示例1:

輸入: 1
輸出: "1"

示例2:

輸入: 4
輸出: "1211"

這個題還真的要稍微多想想才能想通,其實說的挺清楚,就是沒往那裡想,那麼簡單說一下題目意思:這個數是怎麼生成的呢,其實每一個數都要依賴之前一個數生成的字串,那麼就從1開始,1的字串是“1”,所以2的字串一看1的字串是1個1,所以“11”,前面的1代表1個,後面的1代表數字1。然後3的字串一看2的字串是2個1,所以就是“21”,然後4的字串一看3的字串是1個2,1個1,所以就是“1211”。依次類推,這樣應該就稍微清楚一點。所以程式設計思路也就出來了,不管給出n是多少,都要從1的字串開始推,這裡為了後面的程式好編寫,我是從2的字串開始推得,否則處理起來挺麻煩。思路是這樣的,從3開始,一直到n都要取到,所以程式設計時要<=n或者<n+1,然後對於3~n的每個陣列都要推出其對應的字串,推導過程就是利用前一個字串然後遍歷其所有字元元素,看每一個不同的字元元素的個數,這個一定記得不能全域性計數,只要前後數不相同,計數就停止,然後字串加和。
C++原始碼:

class Solution {
public:
    string countAndSay(int n) {
        if (n==1)
            return "1";
        if (n==2)
            return "11";
        string now = "11";
        for (int i=3;i<n+1;i++)
        {
            string pre = now;
            now = "";
            char num = pre[0];
            int
count = 1; for (int j=1;j<pre.length();j++) { if (pre[j]==num) count++; else { num = pre[j]; now = now + to_string(count) + pre[j-1]; count = 1; } } now = now + to_string(count) + pre[pre.length()-1]; } return now; } };

python3原始碼:

class Solution:
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        if n==1:
            return "1"
        if n==2:
            return "11"
        now = "11"
        for i in range(3, n+1):
            pre = now
            now = ""
            num = pre[0]
            count = 1
            for j in range(1, len(pre)):
                if pre[j]==num:
                    count += 1
                else:
                    num = pre[j]
                    now = now + str(count) + pre[j-1]
                    count = 1
            now += str(count) + pre[-1]
        return now