報數序列是指一個整數序列,按照其中的整數的順序進行報數,獲得下一個數。其前五項以下:函數
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
被讀做 "one 1"
("一個一"
) , 即 11
。11
被讀做 "two 1s"
("兩個一"
), 即 21
。21
被讀做 "one 2"
, "one 1"
("一個二"
, "一個一"
) , 即 1211
。spa
給定一個正整數 n ,輸出報數序列的第 n 項。code
注意:整數順序將表示爲一個字符串。blog
本身的思路:一開始看到這個題目,想着要把這個序列弄出來,而後根據輸入的位數,輸出相應位置的數字就好。並且還要計算每一個數字中各位數字的個數,若是用int存儲,確定是極爲不便的,勢必要用string型來存儲。那麼是轉爲string型呢,仍是一開始就直接用string型呢。確定是後者要方便不少。字符串
void helper(vector<string> &nums,int n) { string x="1"; nums.push_back(x); nums.push_back("11"); for(int k=2;k<n;k++) { int count =1; string str; for(int i=1;i<nums[k-1].size();i++) { if(nums[k-1][i]==nums[k-1][i-1]) { count++; } else { str=str+(char)(count+'0')+nums[k-1][i-1]; count =1; } if(i==nums[k-1].size()-1) { str+=(count+'0'); str+=nums[k-1][i]; } } nums.push_back(str); } } string countAndSay(int n) { helper(nums,n); return nums[n-1]; }
我這裏首先將前兩個提早輸入進去,並且利用了一個額外的函數,將這個序列的前n個數先搞出來,在上層函數直接按位置去取。string
雖然思路還算過關,但實現方式過於繁瑣了,因此就參考了大神的實現方式:class
string countAndSay(int n) { if(n==0) return ""; if(n==1) return "1"; string str = "11"; for(int i=2;i < n;i++) { int count = 1; string temp ; for(int j=1; j <str.length();j++) { if(str[j]==str[j-1]) count++; else { temp+=('0'+count); temp+=str[j-1]; count=1; } if(j==str.length()-1) { temp+=(count+'0'); temp+=str[j]; } } str = temp; } return str; }
思路和我相似,但他並無把全部序列都獲得,他只是去找目標位置的數字,這個是符合題意的,可是由於避免下面的訪問越界,仍然要把前兩個值提早固定。(暫時沒想到其餘的辦法)di