问题描述
- leetcode38 报数题,facebook 的面试题,leetcode 上的描述写得并不是很通俗易懂,让人读起来云里雾里。看看别人的题目描述:
- 意思就是:
初始值第一行是 1。
第二行读第一行,读作 1 个 1,去掉个字,写做字符串: “11”。
第三行读第二行,读作 2 个 1,去掉个字,写做字符串: “21”。
第四行读第三行,读作 1 个 2,1 个 1,去掉所有个字,写做字符串: “1211”。
第五行读第四行,读作 1 个 1,1 个 2,2 个 1,去掉所有个字,写作字符串: “ 111221”。
第六行读第五行,读作 3 个 1,2 个 2,1 个 1,去掉所以个字,写作字符串: “312211”。
本题目要求输入 1 - 30 的任意行数,输出该行字符串。
解题思路
- 题目意思弄清楚后,这道题就很清晰明了了,第 n 行结果的来源是他前面的字符串,也就是第 n-1 个字符,那么这就可以用佩波拉契数列的动态规划求解思路去计算了。算是最简单的动态规划了。初始状态为 “1”,依次计算下一个,直到第n个。
Java 解法
1 public static String countAndSay4(int n) { 2 String s = "1"; 3 int i=0; 4 int j; 5 6 for (int k=1; k<n; k++) { 7 StringBuilder sb = new StringBuilder(); 8 char[] chars = s.toCharArray(); 9 while (i < chars.length) { 10 j = i; 11 while (j < chars.length && chars[i] == chars[j]) { 12 j ++; 13 } 14 sb.append(j-i).append(chars[i]); 15 i = j; 16 } 17 s = sb.toString(); 18 i = 0; 19 } 20 return s; 21 }