38. 外观数列
38. 外觀數(shù)列
給定一個(gè)正整數(shù) n ,輸出外觀數(shù)列的第 n 項(xiàng)。
「外觀數(shù)列」是一個(gè)整數(shù)序列,從數(shù)字 1 開始,序列中的每一項(xiàng)都是對前一項(xiàng)的描述。
你可以將其視作是由遞歸公式定義的數(shù)字字符串序列:
- countAndSay(1) = “1”
- countAndSay(n) 是對 countAndSay(n-1) 的描述,然后轉(zhuǎn)換成另一個(gè)數(shù)字字符串。
前五項(xiàng)如下:
例如,數(shù)字字符串 “3322251” 的描述如下圖:
示例 1:
輸入:n = 1
輸出:“1”
解釋:這是一個(gè)基本樣例。
示例 2:
輸入:n = 4
輸出:“1211”
解釋:
countAndSay(1) = “1”
countAndSay(2) = 讀 “1” = 一 個(gè) 1 = “11”
countAndSay(3) = 讀 “11” = 二 個(gè) 1 = “21”
countAndSay(4) = 讀 “21” = 一 個(gè) 2 + 一 個(gè) 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ù)和字符組成新的字符串,使用遞歸的方法,不斷地對下一層返回的字符串進(jìn)行解析,直到到達(dá)遞歸邊界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. 给表达式添加运算符