C ++アルゴリズム:新聞の数

トピック:

これは、数値配列は、次の番号を取得する順序でパケットの整数のために、整数のシーケンスであることを報告しました。5フロント、次のように:
1.1
2.11
3.21
4.1211
5.111221

説明:

1 "は、1つ1"( "A")、すなわち、11として読み取られます。
11「は、2つの1」(「2つの1」)、すなわち、21として読み取られます。
21 "は、1つ1、 "1 2"が読み出され 、"( " すなわち、1211年2"、 "A")。
正の整数n(30≤1≤n)が与えられ 、 出力パケットシーケンス番号の最初のn個のアイテムを。注:整数の順序は、文字列として表さ。

アイデア:

最初のメモリとして数1のそれぞれに格納されたパケットの数を用いてVecotrtemp1、第二のメモリ11であり、...、それぞれ時間がnへのパケットの数が、停止しているとき、vecotrtemp2によって更新され、変換されたデジタルTEMP1ストリング、
パケットの数が得られたら番号:@各TEMP1 [j]を解析がTEMP1に等しい[J + 1]、1、カウンタがインクリメントさに等しい。説明の端部は同じ番号を意味するものではない、その時点のカウントでそして、TEMP1 [j]はTEMP2に押し込まれます。

コード:

//思路:使用一个vecotr<int>temp1存储每次报数的数,如第一次存1,第二次存的是11,....,每次通过vecotr<int>temp2来更新,当报数到n时,停止,并将temp1中数字转换为字符串;
//求取下一次报数的数:每次判断temp1[j]是否等于temp1[j+1],等于则将计数器加1;不等于说明同一个数结束,此时将count和temp1[j]压入temp2中。

class Solution {
public:
    string countAndSay(int n) {
        
        if(n == 1)
            return "1";
        
        vector<int> temp1, temp2;
        temp1.push_back(1);
        int count = 1;
        
        for(int i = 2; i<=n;i++)
        {
            for(int j = 0; j < temp1.size(); j++)
            {
               if((j+1 == temp1.size()) || ((j+1 < temp1.size()) && (temp1[j] != temp1[j+1])))
               {
                   temp2.push_back(count);
                   temp2.push_back(temp1[j]);
                   count = 1;
               }
               else if((j+1 < temp1.size()) && (temp1[j] == temp1[j+1]))
               {
                   count++;
               }
            }
            temp1 = temp2;
            temp2.clear();
        }
        
        //将数字转为字符串
        string ret;
        for(int i = 0; i < temp1.size(); i++)
            ret.append(1, (temp1[i]+48));
        
        return ret;
    }
};

おすすめ

転載: blog.csdn.net/qq_31820761/article/details/90921382
おすすめ