PAT甲級1140Look-and-say Sequence
阿新 • • 發佈:2020-08-04
題目連結
https://pintia.cn/problem-sets/994805342720868352/problems/994805344490864640
題解一
英語
-
corresponding to
與…相一致,我之前似乎記成了“根據……”
思路、注意點和程式碼
- 題目:第n+1個數字是第n個數字的一種描述
- 第n+1個串是第n個串中各個數字的統計
- 統計規則是不好描述,我就不描述了。看樣例或者程式碼就能看出來了
- 注意點:
- 按照我的解法的話,要注意處理一種情況:第3個字串D111的情況
- 首先D出現了1次,得到D1;然後從第一個1開始統計,直到下標大於字串長度,這時已經不用再遍歷字串,應保證遍歷結束
// Problem: PAT Advanced 1140 // URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805344490864640 // Tags: String #include <iostream> #include <string> #include <sstream> using namespace std; string generateNext(string str){ // 字串長度 int len = str.length(); // 生成下一個字串 stringstream next; for (int i = 0; i < len; i++){ // 獲取key char key = str[i]; // 統計key出現的次數 int count = 1; // key出現的次數 int j = i + 1; // 作為下標用來迴圈 while (j < len) { if (key == str[j]) count += 1; else{ // 發現了和key不一樣的字元str[j],即該key的數量統計結束,且外層迴圈應接著從j開始 // i=j-1而非i=j,是因為外層迴圈結束後i還要++ i = j - 1; break; } j++; } // 將該key及其次數儲存至新字串 next << key; next << count; // 處理樣例中第3個字串D111的情況,即內層迴圈不是通過break結束而是一直迴圈至j==len的情況 // 這種情況則不用再進行外層迴圈了,因為最後一個key一直延續到了串的結尾 if (j == len) break; } return next.str(); } int main() { // D是0到9 // 第n+1個數字是第n個數字的一種描述 string s; int n; cin >> s >> n; n -= 1; // 使用者輸入的其實就是第1個串 while (n--){ // cout << s << endl; s = generateNext(s); } cout << s << endl; return 0; }
題解二
- 參考了柳婼的程式碼,妙啊,她的程式碼和我上面寫的題解一相比,有以下不同:
- 用
j-i
實現計數功能,而非像我一樣定義變數count進行計數 - 把
s[i]==s[j]
放在內層迴圈的判斷條件中,而非像我一樣使用if+break
語句 - 外層迴圈結束後不是
i++
,而是直接i=j
(前提是j
此時是下一個待統計字元的下標) - 記憶體迴圈
j
從i
開始,而非像我一樣從i+1
開始。這一點是我的想法比較好
- 用
參考她的思路後,程式碼如下:
// Problem: PAT Advanced 1140 // URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805344490864640 // Tags: String #include <iostream> #include <string> #include <sstream> using namespace std; int main() { string s; // 使用者輸入的數字,最終結果 int n, j; // 第n個字串,迴圈遍歷 cin >> s >> n; n -= 1; // 使用者輸入的其實就是第1個串 while (n--){ string t = ""; for (int i = 0; i < s.length(); i=j){ for (j = i+1; j < s.length() && s[i] == s[j]; j++); t += s[i]; t += to_string(j - i); } s = t; } cout << s << endl; return 0; }
作者:@臭鹹魚
轉載請註明出處:https://www.cnblogs.com/chouxianyu/
歡迎討論和交流!