Skip to content

38. Count and Say

https://leetcode.com/problems/count-and-say/

c++
class Solution {
public:
    string countAndSay(int n) {
        if (n == 1) {
            return "1";
        }
        return sayNum(countAndSay(n - 1));
    }

    string sayNum(string s) {
        char num = '0';
        int count = 0;
        string result;

        for (auto& c : s) {
            if (c == num) {
                count++;
            } else {
                if (count > 0) {
                    result.append(to_string(count)).append(1, num);
                }
                num = c;
                count = 1;
            }
        }
        result.append(to_string(count)).append(1, num);

        return result;
    }
};
go
func countAndSay(n int) string {
    if n == 1 {
        return "1"
    }
    return sayNum(countAndSay(n-1))
}

func sayNum(str string) string {
    num := '0'
    count := 0
    result := ""

    for _, c := range str {
        if c == num {
            count++
        } else {
            if count > 0 {
                result = fmt.Sprintf("%s%d%d", result, count, num-'0')
            }
            num = c
            count = 1
        }
    }
    result = fmt.Sprintf("%s%d%d", result, count, num-'0')

    return result
}
js
/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function(n) {
  if (n === 1) {
    return '1'
  }
  return sayNum(countAndSay(n - 1))
}

function sayNum(numStr) {
  var nums = numStr.split('')
  var result = []
  var num = null
  var count = 0

  nums.forEach(x => {
    if (x === num) {
      count++
    } else {
      if (count) {
        result.push(count, num)
      }
      num = x
      count = 1
    }
  })
  result.push(count, num)

  return result.join('')
}
py
class Solution(object):

    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        return '1' if n == 1 else self.sayNum(self.countAndSay(n - 1))

    def sayNum(self, num):
        cur, count = None, 0
        result = []
        for n in num:
            if cur == n:
                count += 1
            else:
                if count:
                    result += str(count), cur
                cur, count = n, 1

        result += str(count), cur
        return ''.join(result)