字符串压缩(面试准备)

时间:2015-07-17 14:25:38

标签: c++ string compression

我需要压缩一个字符串。可以假设字符串中的每个字符都不会出现超过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;
}

2 个答案:

答案 0 :(得分:0)

可以有很多改进:

  1. 不要为unsigned long函数返回-1。

  2. 请考虑使用size_tssize_t来表示尺寸。

  3. 了解const

  4. 如果重复调用Compress,则m_StrCompressed具有伪造状态。由于这些成员无法重复使用,您也可以将该功能设为静态。

  5. 压缩的东西一般不应该被认为是字符串,而是字节缓冲区。重新设计您的界面。

  6. 评论!没人知道你在这里做RLE。

  7. 奖励:如果您的压缩产生更大的结果,则回退机制。例如一个表示未压缩缓冲区的标志,或者只是返回失败。

  8. 我认为效率不是主要关注点。

答案 1 :(得分:0)

一些事情:

  • 我只是在使用课程,也许你可以在这里以更有意义的方式做到这一点。但考虑到你要做的事情的范围,这里的两个功能会更好。一个用于压缩,一个用于减压。例如,为什么要将类中的字符串存储为对象而从不使用它?如何将它分组为类实际上增强了功能或使其更可重用?
  • 您应该将压缩字符串返回作为引用而不是指针传递。
  • 看起来您正在尝试计算连续重复字符的次数并保存。对于大多数常见字符串,这将使压缩字符串的大小大于未压缩字符串,因为它需要两个字节来存储每个非重复字符。
  • 有很多字符,有两种比特。如果你尝试对重复的位进行分组,那么你会更成功(这实际上是一种简单的无损压缩方法)。
  • 如果您被允许,只需使用像zlib这样的库来压缩任意数据类型。