字符串压缩(面试准备)
String compression (Interview prepare)
我需要压缩字符串。可以假设字符串中的每个字符出现不超过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;
}
还有很多可以改进的地方:
-
unsigned long
函数不返回-1 -
考虑用
size_t
或ssize_t
表示尺寸 -
Learn
const
-
m_StrCompressed有伪状态,如果
Compress
被重复调用。由于这些成员不能被重用,您不妨将函数设置为静态。 -
压缩的东西通常不应该被认为是字符串,而是字节缓冲区。重新设计你的界面
-
评论!没有人知道你在这里做RLE。
-
奖励:如果压缩产生更大的结果,则回退机制。例如,一个标志来表示未压缩的缓冲区,或者只是返回失败。
几点:
- 我完全赞成使用类,也许你可以在这里以一种更有意义的方式做到这一点。但是考虑到你要做的事情的范围,这里最好是两个函数。一个用于压缩,一个用于解压。例如,为什么将字符串作为对象存储在类中而从不使用它?将其分组为一个类实际上如何增强功能或使其更具可重用性?
- 你应该传递你的压缩字符串返回作为引用,而不是一个指针。
- 看起来您正在尝试计算字符在一行中重复的次数并保存该次数。对于大多数常见的字符串,这将使压缩字符串的大小大于未压缩字符串,因为它需要两个字节来存储每个非重复字符。
- 有很多字符,有两种比特。如果你用这种方法来分组重复的比特,你会更成功(这实际上是一种简单的无损压缩方法)。
- 如果允许,使用像zlib这样的库来压缩任意数据类型。
相关文章:
- C++中高效的大型稀疏块压缩线性方程
- 嵌入方指针压缩已禁用
- C++使用整数的压缩数组初始化对象
- 在C++中将函数压缩为两种方式
- 在C++中使用LZ4压缩目录
- 使用C++进行运行长度解压缩
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- C++ 如何将数组值解压缩为函数参数
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 在 Qt(C++) 中使用 QProcess 解压缩 - 提取目录问题
- 浏览压缩文件与游览解压缩它们
- 直接 2D 呈现到命令列表和打印:图片压缩
- 如何在 OpenCV c++ 中压缩 TIFF 格式的图像?
- 如何在C++向量中解压缩多个值
- 解压缩 C 样式数组以及C++中的参数包
- 用于 progmem 的C++和头文件压缩的 Web 文件字节数组
- 如何在 cpp 中解压缩数字,如果它们是使用 struct.pack(fmt, v1, v2, ..) 打包在 pyth
- C++ 初级面试问题:仅使用字符指针压缩字符序列的功能
- 字符串压缩(面试准备)