一 题目描述
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1
11
21
1211
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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二 题目理解
刚拿到题目的时候我是很懵的 哥哥 这是让我找规律吗 我哭了
后来看了好久和网友评论才知道这是个报数的题目 就是后一个对前一个数字进行报数
下一个数是对上一个数的描述,比方说 1211 里有 “ 1 个 1 , 1 个 2 , 2 个 1 ” ,那么 111221 就是它的下一个数。通常我们把这个数列叫做“外观数列”。
其实好像用嘴读出来是比较方便的
第一个数字是1
第二个数字就是一个1 也就是 11
第三个数字是2个1 也就是 21
第四个数字是1个2 , 1 个1 也就是 1211
…
以此类推就是这样子了
我能想到的就是第一个是一,设定初值时就设定为1
然后后面设置变量,如果是一个1 就输出 1 然后 1,如果有两个,就设置变量count进行计数,前面输出的是数量,后面输出的是字符本身。要设置两层循环的,第一层循环遍历,遍历整个数组,后面的就循环遍历是否和之前设置的变量相等,相等则加一,不相等则跳出循环。接着append追加就可以了。
charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
toString()方法返回反映这个对象的字符串
/**
* 解题思路:
* 本题的难点在于:报数的概念理解,至少我从题意中没有很清晰的理解,但是感觉像是个递推式
* 从4->5分析,将4个每一位拆开看(个数+数字),4=1211 => 1=11,2=12,11=21,所以5=111221
* 所以解题用循环,从1->n可求解出来
**/
三 解决代码(java)
class Solution {
public String countAndSay(int n) {
/*最开始的字符串是1,下面的报数循环从2开始的*/
String str ="1";
/*循环从2开始了报数*/
for (int i = 2; i<=n;i++){
StringBuilder builder =new StringBuilder();
char pre = str.charAt(0);
/*重复字符要计数*/
int count = 1;
for(int j = 1; j<str.length();j++){
char c = str.charAt(j);
if (c == pre){
count ++;
}else{
builder.append(count).append(pre);
pre = c;
count =1;
}
}
/*不断追加,个数在前,代表的字符在后*/
builder.append(count).append(pre);
str = builder.toString();
}
return str;
}
}