问题描述:
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.
原问题链接:https://leetcode.com/problems/count-and-say/
问题分析
因为这里是根据一个数字来递推另外一个串。最开始的情况是只有字符串"1",这也是针对n = 1的情况。在后面,对于任何一个串来说,我们需要在遍历的时候计算当前的那个元素出现的次数。在碰到相同元素的时候对计数加一,否则说明碰到另外的一个数字了,需要将当前的数字和出现的次数放到一个串里,然后再将当前不同的那个值设为当前值。在循环遍历结束后,还要将当前的这个值和出现的次数加入到串里。这样就得到了一个一次转换后的结果。
对于给定数字n来说它无非就是按照上述的变换执行了n次。所以可以很容易的得到如下的代码:
public class Solution {
public String countAndSay(int n) {
String s = "1";
for(int i = 1; i < n; i++) {
s = countNumbers(s);
}
return s;
}
private String countNumbers(String s) {
if(s.length() == 1) {
return 1 + s;
}
char cur = s.charAt(0);
int count = 1;
StringBuilder builder = new StringBuilder();
for(int i = 1; i < s.length(); i++) {
if(s.charAt(i) == cur)
count++;
else {
builder.append(count + "" + cur);
cur = s.charAt(i);
count = 1;
}
}
builder.append(count + "" + cur);
return builder.toString();
}
}