美文网首页
LeetCode 38. 报数(To do)

LeetCode 38. 报数(To do)

作者: 饼干不干 | 来源:发表于2019-05-11 22:03 被阅读0次

    报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

    1. 1
    2. 11
    3. 21
    4. 1211
    5. 111221
    1 被读作  "one 1"  ("一个一") , 即 11。
    11 被读作 "two 1s" ("两个一"), 即 21。
    21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211。
    给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
    注意:整数顺序将表示为一个字符串。
    示例 1:
    输入: 1
    输出: "1"
    示例 2:
    输入: 4
    输出: "1211"
    

    C

    char* countAndSay(int n) {
        if(n == 1) return "1";
        char * cur = malloc(2);
        char * temp;
        cur[0] = '1';
        cur[1] = 0;
        int len, idx, j, count;
        for(int i = 2; i <= n; i++) {
            len = strlen(cur);
            temp = malloc(3 * len);
            memset(temp, 0, 3 * len);
            count = 1;
            for(idx = 1, j = 0; idx < len; idx++) {
                if(cur[idx] == cur[idx - 1]) count++;
                else {
                    temp[j++] = '0' + count;
                    temp[j++] = cur[idx - 1];
                    count = 1;
                }
            }
            temp[j++] = '0' + count;
            temp[j] = cur[len - 1];
            free(cur);
            cur = temp;
        }
        return cur;
    }
    

    C++

    class Solution {
    public:
        string countAndSay(int n) {
            string temp = "";
            string num = "";
            int cnt = 1;
            if(n == 1) {
                return "1";
            }
            if(n == 2) {
                return "11";
            }
            string a = "11";
            for(int i = 1; i <= n - 2; i++) {
                for(int j = 1; j < a.length(); j++) {
                    if(a[j-1] == a[j]) {
                        cnt++;
                    }
                    if(a[j-1] != a[j]) {
                        while(cnt) {
                            num = (char)(cnt % 10 + '0') + num;
                            cnt = cnt / 10;
                        }
                        temp += num;
                        num = "";
                        temp += a[j-1];
                        cnt = 1;
                    }
                    if(j == a.length() - 1) {
                        while(cnt) {
                            num = (char)(cnt % 10 + '0') + num;
                            cnt = cnt / 10;
                        }
                        temp += num;
                        num = "";
                        temp += a[j];
                        cnt = 1;
                    }
                }
                a = temp;
                temp = "";
            }
            return a;
        }
    };
    

    相关文章

      网友评论

          本文标题:LeetCode 38. 报数(To do)

          本文链接:https://www.haomeiwen.com/subject/swifaqtx.html