LeetCode演算法題38:報數解析
阿新 • • 發佈:2018-11-02
報數序列是一個整數序列,按照其中的整數的順序進行報數,得到下一個數。其前五項如下:
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