# 2.Count and Say

## 1.Question

![](https://1568020728-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8JEXoorTQqbFzd%2F-M4M0IPqKD21qkycuQ-D%2F-M4M0LecxdEoV8pdk0PF%2F%E6%9C%AA21121.jpg?generation=1586302917730161\&alt=media)

## 2.想法

* 看幾層就跑幾次, 每次比較同一層間前後的字元是否相同, 並儲存counter.
* [將數字轉為字元](https://jenhsuan.gitbooks.io/c-programming/content/chapter7-visual-c++/76common-functions/762jiang-shu-5b5728-1-~-9-zhuan-wei-zi-yuan.html)

## 3. Solution

* C solution

  ```
    char* countAndSay(int n) {
      char * ary = (char *)malloc(5000 * sizeof(char));
      char * oldAry = (char *)malloc(5000 * sizeof(char));
      n = n -1;
      oldAry[0] = '1';
      ary[0] = '1';
      int round = 0;
      int count = 1;
      int index = 0;
      int len = 1;

      while(round < n){
          round = round +1;
          index = 0;
          for(int i = 0 ; i < len; i++){
              if (oldAry[i] == oldAry[i + 1] )
              {
                  //計算重複的數量
                  count = count + 1;        
              }else{
                  //數量 -> 將數字(1~9)轉到字元
                  ary[index++] = count+'0';
                  //什麼數字
                  ary[index++] = oldAry[i];
                  count = 1;    
              }
          }
          //上一次的字元數量
          len = index ;
          //結束字元
          ary[index++] = '\0';
          memcpy(oldAry, ary, len);

      }
      free(oldAry);
      return ary;
     }
  ```

![](https://1568020728-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8JEXoorTQqbFzd%2F-M4M0IPqKD21qkycuQ-D%2F-M4M0LeepSse4Fhvu2zK%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202017-05-04%20%E4%B8%8B%E5%8D%885.37.56.png?generation=1586302917851640\&alt=media)

* JavaScript solution

  ```
        var countAndSay = function(n) {
  ```

  res=""\
  oldAry = \[]; oldAry.push(1) ary = \[]; ary.push(1) round = 0; count = 1; index = 0; len = 1; while(round < n-1){ round++; index = 0 for(i = 0 ; i < len; i++){ if (oldAry\[i] === oldAry\[i+1] ) { count++ }else{ ary\[index++] = count; ary\[index++] = oldAry\[i]; count = 1;\
  } } len = index ; oldAry=ary.slice(0) } ary.forEach(function(element, index, array){ res+=element }) return res };

![](https://1568020728-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8JEXoorTQqbFzd%2F-M4M0IPqKD21qkycuQ-D%2F-M4M0LegQE8vvK2xkGRQ%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202017-01-27%20%E4%B8%8A%E5%8D%8810.53.35.png?generation=1586302918005470\&alt=media)
