Count and Say

Question

  1. The count-and-say sequence is the sequence of integers beginning as follows:
  2. 1, 11, 21, 1211, 111221, ...
  3. 1 is read off as "one 1" or 11.
  4. 11 is read off as "two 1s" or 21.
  5. 21 is read off as "one 2, then one 1" or 1211.
  6. Given an integer n, generate the nth sequence.
  7. Example
  8. Given n = 5, return "111221".
  9. Note
  10. The sequence of integers will be represented as a string.

題解

題目大意是找第 n 個數(字符串表示),規則則是對於連續字符串,表示為重複次數+數本身。純粹是implementation的題目,小心處理實現細節就可以。

Java

  1. public class Solution {
  2. /**
  3. * @param n the nth
  4. * @return the nth sequence
  5. */
  6. public String countAndSay(int n) {
  7. if (n <= 0) return null;
  8. String s = "1";
  9. for (int i = 1; i < n; i++) {
  10. int count = 1;
  11. StringBuilder sb = new StringBuilder();
  12. int sLen = s.length();
  13. for (int j = 0; j < sLen; j++) {
  14. if (j < sLen - 1 && s.charAt(j) == s.charAt(j + 1)) {
  15. count++;
  16. } else {
  17. sb.append(count + "" + s.charAt(j));
  18. // reset
  19. count = 1;
  20. }
  21. }
  22. s = sb.toString();
  23. }
  24. return s;
  25. }
  26. }

C++

  1. class Solution {
  2. public:
  3. string countAndSay(int n) {
  4. string s = "1";
  5. if(n <= 1) return s;
  6. stringstream ss;
  7. while(n-- > 1){
  8. int count = 1;
  9. for(int j = 0; j < s.size(); j++){
  10. if(j < s.size()-1 and s[j] == s[j+1]){
  11. count++;
  12. }
  13. else{
  14. ss << count << s[j];
  15. count = 1;
  16. }
  17. }
  18. s = ss.str();
  19. ss.str("");
  20. }
  21. return s;
  22. }
  23. };

源碼分析

字符串是動態生成的,故使用 StringBuilder 更為合適。注意s 初始化為”1”, 第一重 for循環中注意循環的次數為 n-1.

複雜度分析

Reference