题目:344.反转字符串
文章链接:代码随想录
视频链接:LeetCode:344.反转字符串
题目链接:力扣题目链接
图释:
// 反转字符串
void reverseString(vector<char>& s) {
// 直接使用反转的库函数 reverse
reverse(s.begin(), s.end());
// 不使用
for (int i = 0, j = s.size() - 1; i < s.size() / 2; i++, j--) {
swap(s[i],s[j]);
}
}
题目:541. 反转字符串II
文章链接:代码随想录
视频链接:LeetCode:541.反转字符串||
题目链接:力扣题目链接
图释:
// 反转字符串||
string reverseStr(string s, int k) {
// 每计数2k进行一次反转
for (int i = 0; i < s.size();i+=(2*k)) {
// 不管是满足2k,还是满足大于k小于2k,只要+k不超过s的大小,都是反转前面的k个
if ((i+k)<s.size()){
reverse(s.begin() + i, s.begin() + i + k);
}
else {
// 只有不满足k个,才把后面的都反转
reverse(s.begin() + i, s.end());
}
}
return s;
}
题目:卡码网:54.替换数字
文章链接:代码随想录
题目链接:卡码网题目链接
图释:
// 核心函数
// 替换数字
string ReplaceNumbers(string s) {
// 先遍历里面有多少个数组
int NumbersNum = 0;
for (int i = 0; i < s.size(); i++) {
if ('0' <= s[i] && s[i] <= '9') {
NumbersNum++;
}
}
int originalSize = s.size();
s.resize(s.size() + NumbersNum * 5);
int right = s.size() - 1;
for (int i = originalSize - 1; i >= 0; i--) {
if ('0' <= s[i] && s[i] <= '9') {
s[right--] = 'r';
s[right--] = 'e';
s[right--] = 'b';
s[right--] = 'm';
s[right--] = 'u';
s[right--] = 'n';
}
else {
s[right--] = s[i];
}
}
return s;
}
题目:151.翻转字符串里的单词
文章链接:代码随想录
视频链接:LeetCode:151.翻转字符串里的单词
题目链接:力扣题目链接
图释:
class Solution {
public:
// 移除多余的空格
string removeExtraSpaces(string s) {
int slowIndex = 0, fastIndex = 0;
// 移除头部空格
while (s.size() > 0 && fastIndex<s.size() && s[fastIndex] == ' ') {
fastIndex++;
}
// 移除中间的空格
for (; fastIndex < s.size(); fastIndex++) {
// 如果中间有连续空格,则fastIndex++
if (fastIndex>0 && s[fastIndex - 1] == ' '&& s[fastIndex] == ' ') {
continue;
}
else { // 如果不为连续空格才进行赋值
s[slowIndex++] = s[fastIndex];
}
}
// eg "_ _ 1 2 _ _"
// 当"1 2 1(slow) 2 _(fast) _"时还执行一次s[slowIndex++] = s[fastIndex]; 复制完slowIndex++
// 所以最后为->"1 2 _ 1(slow) 2 _(fast) _" fast超出界限
// 移除尾端的空格
if (slowIndex - 1 > 0 && s[slowIndex-1] == ' ') { //判断"1 2 _(slow-1) 1 2 _ _"
s.resize(slowIndex-1);
}
else {
s.resize(slowIndex); //
}
return s;
}
// 反转字符串中的单词
string reverseWords(string s) {
// 第一步 去除多余空格
s = removeExtraSpaces(s);
// 第二步 反转整个字符串
reverse(s.begin(), s.end());
// 第三步 反转单个单词
int slowIndex = 0, fastIndex = 0;
for (; fastIndex < s.size(); fastIndex++) {
if (s[fastIndex] == ' ') {
reverse(s.begin() + slowIndex, s.begin() + fastIndex);
slowIndex = fastIndex + 1;
fastIndex++;
}
}
// 最后因为fastIndex==s.size()时,访问会出错,所以只能最后再反转
reverse(s.begin() + slowIndex, s.end());
return s;
}
};
题目:卡码网:55.右旋转字符串
文章链接:代码随想录
题目链接:卡码网题目链接
图释:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
string s;
cin >> n;
cin >> s;
int len = s.size();
// 整体反转
reverse(s.begin(), s.end());
// 单独段进行反转
reverse(s.begin(), s.begin()+n);
reverse(s.begin() + n + 1, s.end());
cout << s << endl;
}