1. 程式人生 > 其它 >每日演算法題--外觀數列(簡單)

每日演算法題--外觀數列(簡單)

技術標籤:每日演算法演算法

題目描述

給定一個正整數 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" 的描述如下圖:

img

示例 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

題解

燒腦細胞的一天。程式碼一擺,就看你自己去理解!這對於我這種小白來說,太難了,唉!

迴歸正題:

首先第一步,我們要確定一種思想–那就是遞迴唄!

首先弄一個遞迴結束條件唄!

 if(n == 1) {
            return "1";
        }

然後遞迴流程走一走唄

String num = countAndSay(n - 1);
StringBuilder s = new StringBuilder();

然後該判斷了吧?邏輯理一下唄!

當 num.charAt(i) == num.charAt(i+1)相等的時候,是不是就可以假設是11啊?那麼11的下一個n是不是2個1啊?所以是不是得一個設一個count=1,然後再判斷漁具下面自加一下唄,然後i++繼續跳到下一個num.charAt(i)唄

當它們不相等的時候,是不是又出現了一個新的數字啊?比如說21,是不是就得變成1個2,一個1了啊?所以count=1得處於for迴圈裡面,while迴圈外面。

這個i < num.length()-1 ,及時判斷是否溢位唄!不然這個i++會溢位的。

所以程式碼有:

int count = 1;
while(i < num.length()-1 && num.charAt(i) == num.charAt(i+1)) {
            count++;
             i++;
            }

然後是不是得讓他們append一下?

所以

s.append(count);
s.append(num.charAt(i));

上面程式碼懂嗎?不懂?再舉個例子:就是11,那麼11的下一個n是不是2個1啊?那麼s起初為空的情況下,s.append(count)是不是2,s.append(num.charAt(i))是不是就是1,然後字串拼接起來就不是21了嗎?

然後再加個迴圈就解決了這個問題唄!

總體程式碼

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int var = sc.nextInt();
            System.out.println(countAndSay(var));
        }
    }

    public static String countAndSay(int n) {
        if(n == 1) {
            return "1";
        }
        String num = countAndSay(n - 1);
        StringBuilder s = new StringBuilder();
        for(int i=0; i<num.length(); i++) {
            int count = 1;
            while(i < num.length()-1 && num.charAt(i) == num.charAt(i+1)) {
                count++;
                i++;
            }
            s.append(count);
            s.append(num.charAt(i));
        }
        return s.toString();
    }
}

演算法題來源:力扣
歡迎朋友們一起進步!!!
2020-12-20