0 と 1 の文字列を圧縮する関数を作成しようとしています。つまり、「00010111100101」は「30104100101」になります。これは非常に複雑な手順である必要がありますか? 私のコードは乱雑に見えます。
プロトタイプは次のようになります。
static void compress_bitstring(std::string& str) {
// compression algorithm
}
0 と 1 の文字列を圧縮する関数を作成しようとしています。つまり、「00010111100101」は「30104100101」になります。これは非常に複雑な手順である必要がありますか? 私のコードは乱雑に見えます。
プロトタイプは次のようになります。
static void compress_bitstring(std::string& str) {
// compression algorithm
}
わかりました、これが私の最終的な答えです。ランレングス> 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;
}
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;
}