1 题干
相信大家第一次在leetcode上看到这道题的时候会觉得不知道表达的什么意思,而且还是英文版的,我也是那样,自己在网上搜索查看,找到很多别人写的文章,理解了其中的意思,在这里为自己也做一个简单的描述,首先请看下面的题目内容:
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.
题意:当n=1 的时候返回字符串1,当n=2 的时候查看上一个字符串的个数,因为上一个字符串是一个1,所以返回的是11,当n=3的时候,因为上一个字符串为11,是两个1,所以返回的结果就是21。就是这样以此类推。
2 代码
在第一次自己手动编写代码的时候,思路是这样:将得到的字符串转换为字符数组,然后进行一个循环的遍历比较,进行计数,但是并没有使用到递归的思想,导致没有成功。后来在看了别人的文章之后,得到突破,将问题处理掉,源地址来自于这里。大家也可以参看。
public static String countSay(int n) { // 开始n=1的时候,单独处理 if (n == 1) { return "1"; } // 递归方法 String str = countSay(n - 1) + "*";// 加一个后缀方便在循环中"处理"掉 char[] cs = str.toCharArray(); String s = ""; int count = 1; for (int i = 0; i < cs.length-1; i++) { if (cs[i] == cs[i + 1]) { count++; } else { s = s + count + cs[i]; count = 1; } } return s; }
3 总结
在代码中的加上*号是为了便于字符之间的比较。使用递归思想。特殊情况单独处理。