LeetCode 38 外观数列
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
- k = j,找到所有相等的数 最后执行
时间复杂度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();
}
}

浙公网安备 33010602011771号