C++学习记录-旧题新做-字符串压缩

旧题记录帖:https://blog.csdn.net/chamao_/article/details/143305269?fromshare=blogdetail&sharetype=blogdetail&sharerId=143305269&sharerefer=PC&sharesource=chamao_&sharefrom=from_link

c++解法:

cpp 复制代码
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

例如:

cpp 复制代码
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!

如果你写:

cpp 复制代码
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 会自动管理内存,完全不会溢出。

对比:

cpp 复制代码
char buf[20];
sprintf(buf, "%d", num);   // 危险,需检查大小

char buf[20]; sprintf(buf, "%d", num); // 危险,需检查大小

C++ 写法:

cpp 复制代码
std::string s = std::to_string(num);

std::string s = std::to_string(num);

一行解决。

相关推荐
UP_Continue2 小时前
C++--哈希封装my_unordered_set和my_unordered_map
c++·哈希算法·散列表
拉姆哥的小屋2 小时前
从原子到性能:机器学习如何重塑双金属催化剂的设计范式
人工智能·python·算法·机器学习
leoufung2 小时前
LeetCode 162:寻找峰值的二分搜索思想与区间不变式分析
算法·leetcode·职场和发展
Non importa2 小时前
用滑动窗口代替暴力枚举:算法新手的第二道砍
java·数据结构·c++·学习·算法·leetcode·哈希算法
free-elcmacom2 小时前
机器学习进阶<10>分类器集成:集成学习算法
python·算法·机器学习·集成学习
以孝治家行动2 小时前
学孝道故事 传家国情怀——慈明学校以孝治家阳光家教中心开展线上学习
学习·以孝治家·正能量
laocooon5238578862 小时前
C语言枚举知识详解与示例
java·c语言·数据库
全栈陈序员2 小时前
【Python】基础语法入门(十八)——函数式编程初探:用 `map`、`filter`、`reduce` 和 `lambda` 写出更简洁的代码
开发语言·人工智能·python·学习
月明长歌3 小时前
【码道初阶】【LeetCode 160】相交链表:让跑者“起跑线对齐”的智慧
java·算法·leetcode·链表