報數序列是指一個整照其中的整數的順序進數序列,按行報數,得到下一個數。其前五項如下:
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"
題意:是不是跟筆者一樣,剛看完題目都不知道這個題目在說些什麼~其實它就是第一個是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)); }