【題目描述】
報數序列是一個整數序列皂冰,按照其中的整數的順序進行報數击你,得到下一個數。其前五項如下:
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、看例子就想到遞歸可以解決此問題伴网,因為第n個結果需要知道第n-1個結果蓬推,第n-1個結果需要知道第n-2個結果,以此類推
2澡腾、必須有臨界點沸伏,這兒的臨界點是 1 = 1
3、所以需要保留上一次的值动分,使用上一次的值計算當前的值
4毅糟、時間復雜度O(n^2)
5、空間復雜度O(1)
代碼實現:
func countAndSay(_ n: Int) -> String {
if n == 0 {
return "1"
}
var res = "1"
for _ in 1..<n {
var tmp = ""
var pre = Array(res)
var count = 1
for j in 0..<pre.count {
if j+1 < pre.count && pre[j] == pre[j+1] {
count+=1
} else {
tmp.append(String(count))
tmp.append(pre[j])
count = 1
}
}
res = tmp
}
return res
}