我需要压缩一个字符串。可以假设字符串中的每个字符都不会出现超过255次。我需要返回压缩字符串及其长度。 最近两年我使用C#并忘记了C ++。我很高兴听到您对代码,算法和c ++编程实践的评论
// StringCompressor.h
class StringCompressor
{
public:
StringCompressor();
~StringCompressor();
unsigned long Compress(string str, string* strCompressedPtr);
string DeCompress(string strCompressed);
private:
string m_StrCompressed;
static const char c_MaxLen;
};
// StringCompressor.cpp
#include "StringCompressor.h"
const char StringCompressor::c_MaxLen = 255;
StringCompressor::StringCompressor()
{
}
StringCompressor::~StringCompressor()
{
}
unsigned long StringCompressor::Compress(string str, string* strCompressedPtr)
{
if (str.empty())
{
return 0;
}
char currentChar = str[0];
char count = 1;
for (string::iterator it = str.begin() + 1; it != str.end(); ++it)
{
if (*it == currentChar)
{
count++;
if (count == c_MaxLen)
{
return -1;
}
}
else
{
m_StrCompressed+=currentChar;
m_StrCompressed+=count;
currentChar = *it;
count = 1;
}
}
m_StrCompressed += currentChar;
m_StrCompressed += count;
*strCompressedPtr = m_StrCompressed;
return m_StrCompressed.length();
}
string StringCompressor::DeCompress(string strCompressed)
{
string res;
if (strCompressed.length() % 2 != 0)
{
return res;
}
for (string::iterator it = strCompressed.begin(); it != strCompressed.end(); it+=2)
{
char dup = *(it + 1);
res += string(dup, *it);
}
return res;
}
答案 0 :(得分:0)
可以有很多改进:
不要为unsigned long
函数返回-1。
请考虑使用size_t
或ssize_t
来表示尺寸。
了解const
如果重复调用Compress
,则m_StrCompressed具有伪造状态。由于这些成员无法重复使用,您也可以将该功能设为静态。
压缩的东西一般不应该被认为是字符串,而是字节缓冲区。重新设计您的界面。
评论!没人知道你在这里做RLE。
奖励:如果您的压缩产生更大的结果,则回退机制。例如一个表示未压缩缓冲区的标志,或者只是返回失败。
我认为效率不是主要关注点。
答案 1 :(得分:0)
一些事情: