Count and Say
Question
- leetcode: Count and Say | LeetCode OJ
-
lintcode: (420) Count and Say
- The count-and-say sequence is the sequence of integers beginning as follows:
-
- 1, 11, 21, 1211, 111221, ...
-
- 1 is read off as "one 1" or 11.
-
- 11 is read off as "two 1s" or 21.
-
- 21 is read off as "one 2, then one 1" or 1211.
-
- Given an integer n, generate the nth sequence.
-
- Example
- Given n = 5, return "111221".
-
- Note
- The sequence of integers will be represented as a string.
-
- The count-and-say sequence is the sequence of integers beginning as follows:
題解
題目大意是找第 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. 9. String s = "1";
10. for (int i = 1; i < n; i++) {
11. int count = 1;
12. StringBuilder sb = new StringBuilder();
13. int sLen = s.length();
14. for (int j = 0; j < sLen; j++) {
15. if (j < sLen - 1 && s.charAt(j) == s.charAt(j + 1)) {
16. count++;
17. } else {
18. sb.append(count + "" + s.charAt(j));
19. // reset
20. count = 1;
21. }
22. }
23. s = sb.toString();
24. }
25. 26. return s;
27. }
28. }
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
- [leetcode]Count and Say - 喵星人與汪星人
