38. count and say

题目描述

对第 n个序列,其为第 n-1序列的个数式。
个数式: 112 => 2112,111 => 31。

题目分析

不断迭代计算个数式。

代码

#include <iostream>

class Solution {
public:
  std::string countAndSay(int n) {
    std::string a = "1";
    while (--n) {
      a = say(a);
    }
    return a;
  }

  std::string say(std::string a) {
    int sum = 1;
    std::string result = "";
    for (unsigned i = 1; i <= a.length(); ++i) {
      if (i == a.length() || a[i] != a[i-1]) {
        result += intToStdString(sum);
        result += charToStdString(a[i-1]);
        sum = 1;
      } else {
        ++sum;
      }
    }
    return result;
  }

  std::string intToStdString(int sum) {
    std::string result = "";
    while (sum > 0) {
      result += charToStdString(sum % 10 + '0');
      sum /= 10;
    }
    for (unsigned i = 0; i < result.length()/2; ++i) {
      char tmp = result[i];
      result[i] = result[result.length()-i-1];
      result[result.length()-i-1] = tmp;
    }
    return result;
  }

  std::string charToStdString(char c) {
    char p[2];
    p[0] = c;
    p[1] = '