leetcode 38 | 報數(簡單題)

報數序列是指一個整照其中的整數的順序進數序列,按行報數,得到下一個數。其前五項如下:

1.     1 
2.     11 
3.     21 
4.     1211 
5.     111221

1 被讀作 "one 1" ("一個一") , 即 1111 被讀作 "two 1s" ("兩個一"), 即 2121 被讀作 "one 2", "one 1""一個二" , "一個一") , 即 1211

給定一個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。

注意:整數順序將表示爲一個字符串。

示例 1:

輸入: 1
輸出: "1"

示例 2:

輸入: 4
輸出: "1211"

題意:是不是跟筆者一樣,剛看完題目都不知道這個題目在說些什麼~其實它就是第一個是1,第二個就是上一個的讀法,即1個1,所以第二個就是11,然後第三個又是上個的讀法,2(兩)個1,所以第三個爲21,以此類推。這下是不是懂了題目的意思呢~

分析:我們可以寫一個say()方法,用來"讀"上一個數,其中用一個count計數器來記錄相同元素,用一個flag變量來標誌當前讀取到上一個字符串的哪個位置,然後通過"讀"出幾個幾,來拼接一下字符串,返回這個字符串。對這個方法循環使用n-1次,即可得出第n個的"讀"數序列。

代碼實現:

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;
}

int main (){ //此處爲一個測試例子
    printf("%s\n", countAndSay(5));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章