旧题记录帖:https://blog.csdn.net/chamao_/article/details/143305269?fromshare=blogdetail&sharetype=blogdetail&sharerId=143305269&sharerefer=PC&sharesource=chamao_&sharefrom=from_link
c++解法:
class Solution { public: string compressString(string S) { if(S.empty()) return S; std::string s; s.reserve(S.length() * 2); // .reserve()能提前预留空间 int index = 0; int i = 0; while(i < S.length()) { char currentChar = S[i]; int count = 0; while(i < S.length() && S[i] == currentChar) { count++; i++; } // 追加字符和数字 s += currentChar; s += std::to_string(count); } if(s.length() >= S.length()) { return S; } return s; } };1. 为什么用.reserve() 而不是 .resize()?
reserve(n):只是提前分配“容量”,不改变字符串长度resize(n):改变字符串的“长度”,并用'\0'填充新增字符
在我的压缩字符串构造过程中,我并不希望字符串一开始就变长,所以要用reserve。
2. std::to_string是什么?
to_string()用来把“数字类型”转换为std::string。
例如:
std::string s = std::to_string(123); // "123"std::string s = std::to_string(123); // "123"
这是C++11新增的功能。
3.to_string支持哪些类型?
它支持基本数字类型:
| 类型 | 示例 |
|---|---|
int | std::to_string(10) |
long | std::to_string(123L) |
long long | std::to_string(123LL) |
unsigned | std::to_string(10u) |
unsigned long | std::to_string(10ul) |
unsigned long long | std::to_string(10ull) |
float | std::to_string(3.14f) |
double | std::to_string(3.14) |
long double | std::to_string(3.14L) |
📌注意:不支持 char 和 bool!
如果你写:
std::to_string('A');std::to_string('A');
它会把'A'当做数字 65 转换成"65"。
4. 为什么 C++ 推荐用to_string而不是sprintf?
因为它更安全、更直观:
✔ 不需要格式化字符串
sprintf写错一个%d、%s会崩溃。
to_string不会。
✔ 无需关心缓冲区大小
sprintf必须让你自己保证 buffer 足够大。
to_string会自动管理内存,完全不会溢出。
对比:
char buf[20]; sprintf(buf, "%d", num); // 危险,需检查大小char buf[20]; sprintf(buf, "%d", num); // 危险,需检查大小
C++ 写法:
std::string s = std::to_string(num);std::string s = std::to_string(num);
一行解决。