csp备考Day1|string和vector
csp备考Day1|string和vector
基础知识
1. vector
// 初始化
vector<int> v1; // 空vector
vector<int> v2(5, 0); // 5个0
vector<int> v3 = {1, 2, 3}; // 列表初始化// 关键API
v.push_back(x); // 尾部插入元素(优先用emplace_back更高效)
v.pop_back(); // 删除尾部元素
v.size(); // 元素个数(非容量!)
v.reserve(100); // 预分配空间(避免扩容耗时)
v.erase(v.begin()+2); // 删除第3个元素(注意迭代器失效问题)
sort(v.begin(), v.end()); // 排序(默认升序)
2. string
// 初始化
string s1 = "hello";
string s2(5, 'a'); // "aaaaa"// 关键API
s.substr(start_pos, length); // 截取子串(若省略length则到末尾)
s.find("ll"); // 返回首次出现的位置(未找到返回string::npos)
s.replace(pos, len, "new_str"); // 替换指定位置
s.insert(pos, "insert"); // 插入字符串
stoi(s); // 字符串转整数(注意异常处理)
to_string(123); // 数字转字符串
练习题
题目1:字符串分割
一维
题目描述
输入一个字符串(例如 "a,bc,def"
)和一个分隔符(例如 ','
),输出分割后的字符串数组。
示例输入/输出
输入:s = "hello,world,cpp", delimiter = ','
输出:["hello", "world", "cpp"]
关键思路
- 遍历字符串,记录非分隔符的起始位置
start
- 遇到分隔符时,截取
start
到当前位置的子串 - 处理最后一个子串
参考代码
vector<string> split(const string& s, char delimiter) {vector<string> res;int start = 0;for (int i = 0; i < s.size(); i++) {if (s[i] == delimiter) {res.emplace_back(s.substr(start, i - start));start = i + 1;}}if (start <= s.size()) { // 处理最后一个子串res.emplace_back(s.substr(start));}return res;
}
二维
给你一个字符串数组 words
和一个字符 separator
,请你按 separator
拆分 words
中的每个字符串。
返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。
注意
-
separator
用于决定拆分发生的位置,但它不包含在结果字符串中。 -
拆分可能形成两个以上的字符串。
-
结果字符串必须保持初始相同的先后顺序。
示例 1:
输入:words = ["one.two.three","four.five","six"], separator = "." 输出:["one","two","three","four","five","six"] 解释:在本示例中,我们进行下述拆分:"one.two.three" 拆分为 "one", "two", "three" "four.five" 拆分为 "four", "five" "six" 拆分为 "six" 因此,结果数组为 ["one","two","three","four","five","six"] 。
示例 2:
输入:words = ["$easy$","$problem$"], separator = "$" 输出:["easy","problem"] 解释:在本示例中,我们进行下述拆分:"$easy$" 拆分为 "easy"(不包括空字符串) "$problem$" 拆分为 "problem"(不包括空字符串)因此,结果数组为 ["easy","problem"] 。
示例 3:
输入:words = ["|||"], separator = "|" 输出:[] 解释:在本示例中,"|||" 的拆分结果将只包含一些空字符串,所以我们返回一个空数组 [] 。
class Solution {
public:vector<string> splitWordsBySeparator(vector<string>& words, char separator) {vector<string> res;for(string& s : words){int start=0;for(int j=0;j<s.size();j++){if(s[j]==separator){if(j>start){res.emplace_back(s.substr(start,j-start)); }start=j+1;} }if(start<s.size()){res.emplace_back(s.substr(start));}} return res;}
};
题目2:高精度加法
题目描述
输入两个表示正整数的字符串(长度≤1000),输出它们的和(字符串形式)。
示例输入/输出
输入:num1 = "999", num2 = "9999"
输出:"10998"
关键思路
- 逆序处理每一位,相加并处理进位
- 结果反向得到最终字符串
参考代码
string addStrings(string num1, string num2) {int i = num1.size()-1, j = num2.size()-1;int carry = 0;vector<int> res;while (i >= 0 || j >= 0 || carry > 0) {int a = (i >= 0) ? num1[i--]-'0' : 0;int b = (j >= 0) ? num2[j--]-'0' : 0;int sum = a + b + carry;res.push_back(sum % 10);carry = sum / 10;}string ans;for (int k = res.size()-1; k >= 0; k--) {ans += to_string(res[k]);}return ans;
}