38. 外观数列
38. 外觀數(shù)列
給定一個正整數(shù) n ,輸出外觀數(shù)列的第 n 項。
「外觀數(shù)列」是一個整數(shù)序列,從數(shù)字 1 開始,序列中的每一項都是對前一項的描述。
你可以將其視作是由遞歸公式定義的數(shù)字字符串序列:
- countAndSay(1) = “1”
- countAndSay(n) 是對 countAndSay(n-1) 的描述,然后轉(zhuǎn)換成另一個數(shù)字字符串。
前五項如下:
例如,數(shù)字字符串 “3322251” 的描述如下圖:
示例 1:
輸入:n = 1
輸出:“1”
解釋:這是一個基本樣例。
示例 2:
輸入:n = 4
輸出:“1211”
解釋:
countAndSay(1) = “1”
countAndSay(2) = 讀 “1” = 一 個 1 = “11”
countAndSay(3) = 讀 “11” = 二 個 1 = “21”
countAndSay(4) = 讀 “21” = 一 個 2 + 一 個 1 = “12” + “11” = “1211”
提示:
- 1 <= n <= 30
解題思路
由遞歸公式定義的數(shù)字字符串序列:
- countAndSay(1) = “1”
- countAndSay(n) 是對 countAndSay(n-1) 的描述
對countAndSay(n-1) 的描述本質(zhì)上就是解析字符串,獲取字符串中連續(xù)字符的出現(xiàn)的次數(shù),將字符出現(xiàn)次數(shù)和字符組成新的字符串,使用遞歸的方法,不斷地對下一層返回的字符串進行解析,直到到達遞歸邊界1.
代碼
class Solution {public String countAndSay(int n) {return n==1?"1":parse(countAndSay(n-1));}public String parse(String n) {char pre=n.charAt(0);int cnt=1;StringBuilder sb = new StringBuilder();for (int i=1;i<n.length();i++){if (n.charAt(i)==pre)cnt++;else {sb.append(cnt).append(pre);pre=n.charAt(i);cnt=1;}}sb.append(cnt).append(pre);return sb.toString();}}總結(jié)
- 上一篇: 老公做梦梦到老婆出轨是什么意思
- 下一篇: 282. 给表达式添加运算符