字符串压缩(面试准备)

String compression (Interview prepare)

本文关键字:面试 压缩 字符串      更新时间:2023-10-16

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

还有很多可以改进的地方:

  1. unsigned long函数不返回-1

  2. 考虑用size_tssize_t表示尺寸

  3. Learn const

  4. m_StrCompressed有伪状态,如果Compress被重复调用。由于这些成员不能被重用,您不妨将函数设置为静态。

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

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

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

几点:

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