LeetCode 38 -- Count and Say
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.
解答:本题需要读懂题意,根据上面的count和say的规则,生成一个序列,返回该序列的第N个。程序实现时候,当字符与上一个字符相同时,只计数,不同时,添加上一个字符和上一个字符对应的计数,然后重新计数。第N个序列是根据第N-1个序列产生,因此我们使用递归的方法。
递归方法:
<span style="font-size:14px;">public class Solution {
public String countAndSay(int n) {
if(n == 0) return("");
if(n == 1) return("1");
String s = countAndSay(n - 1);
char ch = s.charAt(0);
int count = 1;
StringBuilder sb = new StringBuilder();
for(int i = 1; i < s.length(); i++){
if(s.charAt(i) == ch){
count ++;
}
else{
sb.append(count);
sb.append(ch);
count = 1;
ch = s.charAt(i);
}
}
sb.append(count);
sb.append(ch);
return sb.toString();
}
}</span>
迭代方法:
<span style="font-size:14px;">public class Solution {
public String countAndSay(int n) {
if(n ==0) return "";
String s ="1";
for(int j = 1; j < n; j++){
StringBuilder sb = new StringBuilder();
char last = s.charAt(0);
int count = 1;
for(int i = 1; i < s.length(); i++){
if(s.charAt(i) == last) count++;
else{
sb.append(count);
sb.append(last);
last = s.charAt(i);
count = 1;
}
}
sb.append(count);
sb.append(last);
s = sb.toString();
}
return s;
}
}</span>