T38. Count and Say【Easy】
題目
count-and-say 隊(duì)列是一個(gè)整數(shù)隊(duì)列纽窟,它是這樣開始的:
1,11聘殖,21挫掏,1211,111221器躏,...
1 可以讀為 "one 1" 或者 11
11 可以讀為 "two 1s" 或者 21
21 可以讀為 "one 2" 铺韧,然后是 "one 1" 或者 1211
給出一個(gè)n, 求出第 n 個(gè)隊(duì)列是什么多矮。
注意:整數(shù)序列將表示為字符串。
思路
首先哈打,看討論說這題題意不清楚塔逃,有的人還是弄錯(cuò)題意,于是咱們把例子再舉得長一點(diǎn)料仗,據(jù)說這樣比較不容易誤解:
1. 1
2. 11
3. 21
4. 1211
5. 111221
6. 312211
7. 13112221
8. 1113213211
9. 31131211131221
10. 13211311123113112211
總的來說就是從左往右數(shù)數(shù)唄患雏,碰到重復(fù)的就說幾個(gè)啥啥啥這樣。比如4->5,讀出來是"1個(gè)1罢维,1個(gè)2淹仑,2個(gè)1",提取其中的數(shù)字就是 111221 肺孵。
代碼主要分成兩部分:
① 數(shù)數(shù)的方法
② n次迭代的方法
具體看代碼以及注釋~
代碼
代碼取自 Top Solution匀借,稍作注釋
public String countAndSay(int n) {
//當(dāng)是 1 的時(shí)候,則直接返回 1
if(n == 1){
return "1";
}
//為了str末尾的標(biāo)記平窘,方便后面循環(huán)讀數(shù)
String str = countAndSay(n-1) + "*";
//轉(zhuǎn)化成char數(shù)組
char[] c = str.toCharArray();
int count = 1;
String s = "";
for(int i = 0; i < c.length - 1;i++){
//上面的*標(biāo)記這里方便統(tǒng)一處理(最后一個(gè)不用特殊處理了)
if(c[i] == c[i+1]){
//計(jì)數(shù)增加吓肋,算重復(fù)
count++;
}else{
//添加字符串并把count置1
s = s + count + c[i];
count = 1;//初始化
}
}
return s;
補(bǔ)充
① 對(duì)字符串處理時(shí)用 toCharArray() 把它先轉(zhuǎn)化成 char 數(shù)組是一種常用方法
② 對(duì)于首尾字符串的處理還有添加一些無關(guān)字符串這樣的做法