持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
1、写在前面
大家好,我是翼同学,这里是【水滴计划 | 刷题日志】
每日两题,拒绝摆烂。
2、内容
2.1、题目一:剑指 Offer 05. 替换空格
链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)
(1) 描述
(2) 举例
(3) 解题
class Solution {
public:
string replaceSpace(string s) {
// 字符串的原先长度
int len = s.length();
// 表示空格的数目
int blank = 0;
// for循环遍历字符串记录空格数目
for (int i = 0; i < len; i++) {
if (s[i] == ' ') blank++;
}
// 重置字符串的大小,扩充到每个空格替换成"%20"之后的大小空间
s.resize(s.length() + blank * 2);
// 取到扩容后的字符串长度
int new_len = s.length();
// 定义两个指针分别指向旧字符串的尾部和新字符串的尾部
int left = len-1;
int right = new_len-1;
// 核心操作:从后往前替换相应的字符
while(left < right) {
// 如果该字符属于空格,则换成%20
if(s[left] == ' ') {
s[right] = '0';
s[right - 1] = '2';
s[right - 2] = '%';
right -= 2;
}
// 如果不是空格,则直接代入字符
else {
s[right] = s[left];
}
// 最后更新指针变量
left--;
right--;
}
// 最后返回字符串
return s;
}
};
2.2、题目二:反转字符串中的单词
链接:151. 反转字符串中的单词 - 力扣(LeetCode)
(1) 描述
(2) 举例
(3) 解题
以" hello world "为例,解题思路如下:
- 去掉多余空格:
"hello world" - 将字符串反转:
"dlrow olleh" - 所有单词反转:
"world hello"
class Solution {
public:
// 自定义函数:用于去除所有多余空格,并在相邻单词之间添加空格
void removeExtraSpaces(string& s) {
// 表示指向新字符串的下标
int slow = 0;
// for循环遍历字符串
for (int i = 0; i < s.length(); ++i) {
// 如果当前元素不是空格,则进行字符添加操作
if (s[i] != ' ') {
// 给各单词之间添加空格(slow != 0说明不是第一个单词)
if (slow != 0) {
s[slow] = ' ';
slow++;
}
// 将当前的单词添加到新字符串中
while (i < s.size() && s[i] != ' ') {
s[slow] = s[i];
slow++;
i++;
}
}
}
// 最后重置字符串的长度(表示字符串移除多余空格后的长度)
s.resize(slow);
}
// 自定义函数:用于反转字符串
void reverse(string& s, int start, int end){
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
// 主函数
string reverseWords(string s) {
// 将多余空格去除掉。
removeExtraSpaces(s);
// 反转字符串
reverse(s, 0, s.size() - 1);
// 定义一个变量用于指向每个单词的首下标
int start = 0;
// for循环遍历字符串
for (int i = 0; i <= s.size(); ++i) {
// 如果字符串到达尾部或者当前字符等于空格,说明遇到一个单词结束,进行反转单词
if (i == s.size() || s[i] == ' ') {
reverse(s, start, i - 1);
start = i + 1;
}
}
// 最后返回运算结果
return s;
}
};
3、写在最后
好了,今天就刷到这里,明天再来。