dreamweaver做網(wǎng)站學(xué)習(xí)解析seo站內(nèi)優(yōu)化包括
外觀數(shù)列
題目描述:
「外觀數(shù)列」是一個數(shù)位字符串序列,由遞歸公式定義:
countAndSay(1) = "1"
countAndSay(n)
?是?countAndSay(n-1)
?的行程長度編碼。
行程長度編碼(RLE)是一種字符串壓縮方法,其工作原理是通過將連續(xù)相同字符(重復(fù)兩次或更多次)替換為字符重復(fù)次數(shù)(運行長度)和字符的串聯(lián)。例如,要壓縮字符串?"3322251"
?,我們將?"33"
?用?"23"
?替換,將?"222"
?用?"32"
?替換,將?"5"
?用?"15"
?替換并將?"1"
?用?"11"
?替換。因此壓縮后字符串變?yōu)?"23321511"
。
給定一個整數(shù)?n
?,返回?外觀數(shù)列?的第?n
?個元素。
示例 1:
輸入:n = 4
輸出:"1211"
解釋:
countAndSay(1) = "1"
countAndSay(2) = "1" 的行程長度編碼 = "11"
countAndSay(3) = "11" 的行程長度編碼 = "21"
countAndSay(4) = "21" 的行程長度編碼 = "1211"
示例 2:
輸入:n = 1
輸出:"1"
解釋:
這是基本情況。
提示:
1 <= n <= 30
思路分析:
????????根據(jù)題意進(jìn)行模擬,從起始條件 k=1?時 ans = "1" 出發(fā),逐步遞推到 k=n?的情況,對于第 k?項而言,其實就是對第 k?1項的「連續(xù)段」的描述,而求「連續(xù)段」長度,可以使用雙指針實現(xiàn)。
代碼實現(xiàn)注解:
class Solution {public String countAndSay(int n) {//設(shè)ans的初始值為1String ans = "1";for(int i= 2; i<=n;i++){//cur用來存放當(dāng)前連續(xù)段String cur = "";//len為前一個連續(xù)段的長度int len = ans.length();//遍歷前一個連續(xù)段得到當(dāng)前描述for(int j = 0;j<len; ){//k指向當(dāng)前遍歷位置int k = j+1;//判斷前后兩數(shù)是否相同,相同則累加while(k<len && ans.charAt(j) == ans.charAt(k))k++;//cnt用來記錄重復(fù)數(shù)的個數(shù)int cnt = k-j;//拼接得到curcur += cnt + "" + ans.charAt(j);//將j移動到當(dāng)前遍歷位置j = k;}ans = cur;}return ans;}
}