The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...
1
is read off as "one 1"
or 11
.
11
is read off as "two 1s"
or 21
.
21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n, generate the nth sequence.
Note: The sequence of integers will be represented as a string.
题解:
首先这道题非常的蛋疼,光翻译题目是看不懂的……其实这道题的要求是这样,先设置一个字符串str:
当n=1,str="1"
当n=2,因为当n=1时,str="1",里面有一个“1”,所以此时的str="11"
当n=3,因为当n=2时,str="11",里面有两个“1”,所以此时的str="21"
当n=4,因为当n=3时,str="21",里面有一个"2",一个“1”,所以此时的str="1211"
当n=5,因为当n=4时,str="1211",里面是:先一个"1",再一个"2",最后两个“1”,所以此时的str="111211"
也就是说,取值为n的字符串是根据取值n-1的字符串来考虑的……
解题思路:
由于取值为n的字符串受n-1的字符串影响,所以我决定从n=1开始获得字符串。然后,需要一个计数器记录字符串连续出现的相同的数字个数,当遇到不同的数字就把计数器置0,重新计数。每结束一层循环表示1,2,3,……,n中某个取值的字符串已经处理好了。
代码:
public String countAndSay(int n){ if(n < 1) return ""; String str = "1"; for(int i = 1;i < n;++i){ int count = 0; StringBuilder builder = new StringBuilder(""); for(int j = 0;j < str.length();++j){ ++count; if((j + 1 < str.length()) && (str.charAt(j) != str.charAt(j + 1))){ builder = builder.append(count).append(str.charAt(j)); count = 0; }else if(j + 1 == str.length()){ builder = builder.append(count).append(str.charAt(j)); } } str = builder.toString(); } return str; }