报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
在真实的面试中遇到
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1
2 描述的是1,是一个1,也就是11
3 描述的是11,是两个1,也就是21
4 描述的是21,是一个2一个1,也就是12-11
5 描述的是1211, 是一个1,一个2,两个1,也就是11-12-21
6 描述的是111221,是三个1,两个2,一个1,也就是31-22-11
7 描述的是312211,是一个3一个1两个2两个1,也即是13-11-22-21
以此类推
这题目读起来就不懂
class Solution {
public String countAndSay(int n) {
StringBuilder sb = new StringBuilder();
//把1追加进去
sb.append(1);
n--;
while (n > 0) {
//每一行的字符串(后来读题发现只要输出某一行的,而不是所有的)
StringBuilder sbTemp = new StringBuilder();
for (int i = 0, len = sb.length(); i < len; i++) {
int j = i;
//计数有几个相同的字符
int count = 0;
//双指针的后指针往后位移并且如果与第一个指针的字符相等则继续位移且计数
while (j < len && sb.charAt(j) == sb.charAt(i)) {
j++;
count++;
}
// 记录 计数+字符 表示 几个什么字符
sbTemp.append(count).append(sb.charAt(i));
// 位移第一个指针,(因为表达式3有个i++,所以这里不是i = j ,而是 i = j - 1)
i = j - 1;
}
n--;
// 将该行的字符串赋值给sb,让下一次循环遍历该行
sb = sbTemp;
}
return sb.toString();
}
}