1. 程式人生 > 實用技巧 >PAT甲級1140Look-and-say Sequence

PAT甲級1140Look-and-say Sequence

題目連結

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此時是下一個待統計字元的下標)
    • 記憶體迴圈ji開始,而非像我一樣從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/

歡迎討論和交流!