count and say

问题描述

  1. leetcode38 报数题,facebook 的面试题,leetcode 上的描述写得并不是很通俗易懂,让人读起来云里雾里。看看别人的题目描述
  2. 意思就是:

    初始值第一行是 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 的任意行数,输出该行字符串。

解题思路

  1. 题目意思弄清楚后,这道题就很清晰明了了,第 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     }
原文地址:https://www.cnblogs.com/dogeLife/p/11040270.html