LeetCode38 外观数列
题目描述
给定一个正整数 n
,输出外观数列的第 n
项。
你可以将其视作是由递归公式定义的数字字符串序列:
-
countAndSay(1) = "1"
-
countAndSay(n)
是对countAndSay(n-1)
的描述,然后转换成另一个数字字符串。
样例
1. 1
2. 11
3. 21
4. 1211
5. 111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
算法分析
模拟题:
- 一开始状态”1”,操作
n-1
次, - 给定一个字符串,计数
- k = j,找到所有相等的数 最后执行
k++
, 所以总共有k-j
个s.charAt(j)
- 更新
j = k
时间复杂度O(n)
Java代码
class Solution {
public String countAndSay(int n) {
StringBuilder ans = new StringBuilder("1");
for(int i = 0; i < n-1; i++){
StringBuilder t = new StringBuilder("");
for(int j = 0; j < ans.length();){
int k = j;
while(k < ans.length() && ans.charAt(k) == ans.charAt(j)){
k++;
}
t.append(k-j).append(ans.charAt(j));
j = k;
}
ans = t;
}
return ans.toString();
}
}