1. 程式人生 > >報數(leetcode簡單篇第三十八題)

報數(leetcode簡單篇第三十八題)

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

  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”—》“11”,“21“—》”1211“,”11“—》”21“,你只要見到這三部分去對應的翻譯就行
實際意義:給出一個初始字串"1",根據以下規則生成字串。如果一個字元s[i]與s[i-1]和s[i+1]不同,那麼就生成"1"+s[i]的字串;如果連續n個字元都相同,那麼就生成"n"+s[i]的字串。例如字串"1"會生成"11",而"11"會生成"21",“21"又會生成"1211”,以此類推。(ps:筆者在寫這道題時遇到了很大的困難是在閱讀網上大佬的文章後才搞懂題的意思)程式碼如下

#define maxn 10005
char s[maxn], t[maxn];
 
char* countAndSay(int n) {
    
    
    strcpy(s, "1");
    strcpy(t, "");
    int cnt = 1;
    char tmp[3];
    for(int i = 2;i <= n;i++){
        int len = strlen(s); 
        for(int j = 0;j < len;j++){
            if(s[j] == s[j + 1]){
                cnt++
; }else { tmp[0] = cnt + '0'; tmp[1] = s[j]; tmp[2] = '\0'; strcat(t, tmp); cnt = 1; } } strcpy(s, t); strcpy(t, ""); } return s; }