LeetCode刷題(13)--外觀數列
阿新 • • 發佈:2021-02-01
題目描述
給定一個正整數 n ,輸出外觀數列的第 n 項。
外觀數列是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。
前五項如下:
1 1
2 11
3 21
4 1211
5 111221
第一項為1
第二項為11表示前一項有1個1
第三項為21,表示前一項有2個1
第四項為1211,表示前一項有1個2和1個1
第五項為111221,表示前一項有1個1,1個2和2個1
示例:
輸入:n = 1
輸出:“1”
示例:
輸入:n = 4
輸出:“1211”
1 <= n <= 30
解題思路
string to_string(int n) { char str[32]={NULL,}; string s1; sprintf(str,"%d",n); s1=str; return s1; } string Shulie(int n) { if(n==1) return "1"; string Pre=Shulie(n-1)+'0'; string res; int len=Pre.size(); int i=0; for(int j=0;j<len;j++) { if(Pre[i]==Pre[j]) { continue; } else { res+=to_string(j-i)+Pre[i]; i++; } } return res; } int main() { cout<<Shulie(3)<<endl; cout<<Shulie(5)<<endl; }
結果:
注意:
1.to_string()方法在c++11以後為系統支援的函式,此前的版本都沒有此函式,需要自己定義。
2.string 結尾+‘0’,在c++11以後系統會自動新增,如果是此前版本需要手動新增,並且編譯器的不同,效果也不一樣,比如在VC6中編譯,不加’0’也可以通過,但是有些編譯器不加會無法輸出值,主要原因是C語言在讀取字串時需要一個特殊字元0來標記指標結束的位置,也就是結束標記,如果沒有此標記,那麼不會有值輸出。
分析:
1.如果輸入1,直接返回字元"1"。
2.定義字串Pre用來儲存前一個字串。
3.獲取前一個字串長度。
4.遍歷前一個字串。
5.如果第i個元素和第j個元素相同,繼續。
7.遍歷結束,返回此時的字串。
假設此時數字為3,那麼此函式會遍歷字串"11"
1.判斷Pre[0]=Pre[0],繼續
2.判斷Pre[0]=Pre[1],繼續
3.判斷Pre[0]=Pre[2], Pre[0]=1,Pre[2]=0,不等,res=to_string(2)+Pre[0]=“21”;