您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Go Java算法之外觀數列如何實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Go Java算法之外觀數列如何實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
給定一個正整數 n ,輸出外觀數列的第 n 項。
「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。
你可以將其視作是由遞歸公式定義的數字字符串序列:
countAndSay(1) = "1"
countAndSay(n) 是對 countAndSay(n-1) 的描述,然后轉換成另一個數字字符串。
前五項如下:
1、1 —— 第一項是數字 1
2、11 —— 描述前一項,這個數是 1 即 “ 一 個 1 ”,記作 "11"
3、21 —— 描述前一項,這個數是 11 即 “ 二 個 1 ” ,記作 "21"
4、1211 —— 描述前一項,這個數是 21 即 “ 一 個 2 + 一 個 1 ” ,記作 "1211"
5、111221 —— 描述前一項,這個數是 1211 即 “ 一 個 1 + 一 個 2 + 二 個 1 ” ,記作 "111221"
所謂的「外觀數列」,其實本質上只是依次統計字符串中連續相同字符的個數。
題目中給定的遞歸公式定義的數字字符串序列如下:
countAndSay(1) = "1";
countAndSay(n) 是對 countAndSay(n-1) 的描述,然后轉換成另一個數字字符串。
我們定義字符串 S_{i}表示countAndSay(i),我們如果要求得 S_{n},則我們需先求出 S_{n-1},然后按照上述描述的方法生成,即從左到右依次掃描字符串 S_{n-1}中連續相同的字符的最大數目,然后將字符的統計數目轉化為數字字符串再連接上對應的字符。
class Solution { public String countAndSay(int n) { String str = "1"; for (int i = 2; i <= n; ++i) { StringBuilder sb = new StringBuilder(); int start = 0; int pos = 0; while (pos < str.length()) { while (pos < str.length() && str.charAt(pos) == str.charAt(start)) { pos++; } sb.append(Integer.toString(pos - start)).append(str.charAt(start)); start = pos; } str = sb.toString(); } return str; } }
N 為給定的正整數,M 為生成的字符串中的最大長度
時間復雜度:O(N * M)
空間復雜度:O(M)
具體的方法分析已經在上文中表述
由于每次得到的數據都是來源于上一次的結果,所以我們可以假設得到了上次的結果,繼而往后運算。這就運用到了遞歸。
func countAndSay(n int) string { if n == 1 { return "1" } s := countAndSay(n - 1) i, res := 0, "" length := len(s) for j := 0; j < length; j++ { if s[j] != s[i] { res += strconv.Itoa(j-i) + string(s[i]) i = j } } res += strconv.Itoa(length-i) + string(s[i]) return res }
N 為給定的正整數,M 為生成的字符串中的最大長度
時間復雜度:O(N * M)
空間復雜度:O(M)
讀到這里,這篇“Go Java算法之外觀數列如何實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。