标题:数数并说
报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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 ,输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1 输出: "1"
示例 2:
输入: 4 输出: "1211"
这个思路还是比较简单的,做n次循环,每次利用上一次循环的得到的字符串来生成下一个字符串
生成的规则就是:从字符串的头开始依次检测,记录相同数字的个数,然后生成下一个字符串
public class countAndSay {
public static void main(String[] args) {
System.out.println(countAndSay(4));
}
public static String countAndSay(int n) {
if(n==1){
return "1";
}
StringBuffer sb=new StringBuffer("1");
for(int i=2;i<=n;i++){
//这个命名没写好,应该用temp的,来表明是作为每一次暂时存在结果的变量
StringBuffer sb1=new StringBuffer();
//sb就是上一次循环后生成的结果,遍历sb字符串中的每一个字符
for(int j=0;j<sb.length();j++){
//count是每个字符的计数,初始为1
int count=1;
//如果遍历到最后一个字符了,那么就直接把该字符加到sb1中
//至于为什么这种情况是append(1)呢?
//主要是这个if判断是在跑测试用例是发现有错误时才考虑的这种情况
//如果结合到后面的一起来看,会发现,如果最后一个字符和前面的字符是相等的话
//就直接在else里加到sb1了
//如果最后一个字符和前一个字符不相等,就会在前一个字符跳出else
if(j==sb.length()-1){
sb1.append(1);
sb1.append(sb.charAt(j));
}else{
while(sb.charAt(j)==sb.charAt(j+1)){
//我特别喜欢在for循环里用while来遍历比较
//所以就有一个问题,j等于最后一个索引时,j+1就会越界
//所以记得以后要有一个判断
//如果j等于length()-2了,就说明执行到串尾了,要考虑结束while循环了
if(j==sb.length()-2){
j++;
count++;
break;
}else{
count++;
j++;
}
}
sb1.append(count);
sb1.append(sb.charAt(j));
}
}
//结果串赋值为当前循环执行完毕后的sb1
sb=sb1;
}
return sb.toString();
}
}