-5

0 と 1 の文字列を圧縮する関数を作成しようとしています。つまり、「00010111100101」は「30104100101」になります。これは非常に複雑な手順である必要がありますか? 私のコードは乱雑に見えます。

プロトタイプは次のようになります。

static void compress_bitstring(std::string& str) { 
   // compression algorithm
} 
4

5 に答える 5

1

わかりました、これが私の最終的な答えです。ランレングス> 9の圧縮と複製コードのリファクタリングです。

template<typename T>
std::string to_string(T t)
{
    std::ostringstream str;
    str << t;
    return str.str();
}

static void compress_bitstring(std::string& str)
{
    std::string result;
    int count = 0;
    char last = 0;

    auto add_to_result = [&]{
        if (count > 2)
            result += to_string(count) + last;
        else for (auto loop=0; loop<count; ++loop)
            result += last;
    };

    for (char ch : str)
    {
        if ((last == 0  ||  ch == last)  &&  count < 9)
            ++count;
        else {
            add_to_result();
            count = 1;
        }
        last = ch;
    }

    add_to_result();
    swap(result, str);
}

int main()
{
    std::string str("00010111100101");
    compress_bitstring(str);
    assert(str == "30104100101");

    str = "0001011110010100000000000000000000000001";
    compress_bitstring(str);
    assert(str == "301041001019090701");

    return 0;
}
于 2013-07-27T08:51:17.533 に答える
0
template<typename T>
std::string to_string(T t)
{
    std::ostringstream str;
    str << t;
    return str.str();
}

static void compress_bitstring(std::string& str)
{
    std::string result;
    int count = 0;
    char last = 0;
    for (char ch : str)
    {
        if (last == 0  ||  ch == last)
            ++count;
        else {
            if (count > 2)
                result += to_string(count) + last;
            else for (auto loop=0; loop<count; ++loop)
                result += last;
            count = 1;
        }
        last = ch;
    }

    if (count > 2)
        result += to_string(count) + last;
    else for (auto loop=0; loop<count; ++loop)
            result += last;

    swap(result, str);
}

int main()
{
    std::string str("00010111100101");
    compress_bitstring(str);
    assert(str == "30104100101");

    return 0;
}
于 2013-07-27T08:13:44.497 に答える