題目
給定一個正整數?n
?,輸出外觀數列的第?n
?項。
「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。
你可以將其視作是由遞歸公式定義的數字字符串序列:
countAndSay(1) = "1"
countAndSay(n)
?是對?countAndSay(n-1)
?的描述,然后轉換成另一個數字字符串。
前五項如下:
1. 1 2. 11 3. 21 4. 1211 5. 111221 第一項是數字 1 描述前一項,這個數是1
即 “ 一 個 1 ”,記作"11"
描述前一項,這個數是11
即 “ 二 個 1 ” ,記作"21"
描述前一項,這個數是21
即 “ 一 個 2 + 一 個 1 ” ,記作 "1211"
描述前一項,這個數是1211
即 “ 一 個 1 + 一 個 2 + 二 個 1 ” ,記作 "111221"
要?描述?一個數字字符串,首先要將字符串分割為?最小?數量的組,每個組都由連續的最多?相同字符?組成。然后對于每個組,先描述字符的數量,然后描述字符,形成一個描述組。要將描述轉換為數字字符串,先將每組中的字符數量用數字替換,再將所有描述組連接起來。
例如,數字字符串?"3322251"
?的描述如下圖:
示例 1:
輸入:n = 1 輸出:"1" 解釋:這是一個基本樣例。
示例 2:
輸入:n = 4 輸出:"1211" 解釋: countAndSay(1) = "1" countAndSay(2) = 讀 "1" = 一 個 1 = "11" countAndSay(3) = 讀 "11" = 二 個 1 = "21" countAndSay(4) = 讀 "21" = 一 個 2 + 一 個 1 = "12" + "11" = "1211"
提示:?
1 <= n <= 30
代碼?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>char * countAndSay(int n);int main()
{printf("%s",countAndSay(1));return 0;
}char * countAndSay(int n)
{int data=10;char*res="1"; char*temp=(char*)malloc(sizeof(char)*data);memset(temp,0,sizeof(temp));for(int ni=1;ni<n;ni++){int reslen=strlen(res);//遍歷的長度int j=0;while(j<reslen)//保證遍歷完全{int p=j;//上一次for循環結束的位置for(;res[p]==res[j]&&p<reslen;p++);//p是最后相同位的下一位int temp_len=strlen(temp);temp[temp_len]=p-j+48;//個數temp[temp_len+1]=res[j];//對應數字字符j=p;//j要更新}res=temp;if(strlen(temp)*2>=data){data=data*2;}temp=(char*)malloc(sizeof(char)*data);memset(temp,0,sizeof(char)*data);//不可寫成memset(temp,0,sizeof(temp));}return res;
}
?