问题描述:
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(); } }