541 反转字符串Ⅱ
反转字符串 reverseStr1方法是根据区间反转字符串
class Solution {
public:
void reverseStr1(string& s,int m,int n){
for(int i=m,j=n;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=(2*k)){
if(i+k<=s.size()){
reverseStr1(s,i,i+k-1);
continue;
}
reverseStr1(s,i,s.size()-1);
}
return s;
}
};
54 替换数字
替换数字考虑从后往前替换 先确定替换数字后 字符串的大小 通过resize函数重新确定字符串的大小 然后从后往前遍历 遇到数字就替换通过两个指针oldindex和newindex
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sOldIndex = s.size() - 1;
int count = 0; // 统计数字的个数
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewIndex = s.size() - 1;
// 从后往前将数字替换为"number"
while (sOldIndex >= 0) {
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
s[sNewIndex--] = 'r';
s[sNewIndex--] = 'e';
s[sNewIndex--] = 'b';
s[sNewIndex--] = 'm';
s[sNewIndex--] = 'u';
s[sNewIndex--] = 'n';
} else {
s[sNewIndex--] = s[sOldIndex];
}
sOldIndex--;
}
cout << s << endl;
}
}
151 反转字符串中的单词
这题的思路是 首先要处理字符串 把字符串多余的空格给去除 然后用写一个区间反转的函数 先将字符串整体反转后 通过两个指针 遍历反转后的字符串 遇到空格则表示一个单词 然后再将这个单词所在的区间反转
class Solution {
public:
void reverse1(string& s, int start, int end){
for(int i=start,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
void removespace(string& s){
int slow = 0;
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
if(slow!=0){
s[slow++]=' ';
}
while(s[i]!=' ' && i<s.size()){
s[slow++]=s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removespace(s);
reverse1(s,0,s.size()-1);
int start = 0;
for(int i=0;i<=s.size();i++){
if(i==s.size() || s[i]==' '){
reverse1(s,start,i-1);
start=i+1;
}
}
return s;
}
};
55 右旋字符串
这题思路与151类似 首先也是将整体反转 然后根据K值 分别反转区间
#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.begin() + len - n); // 先反转前一段,长度len-n ,注意这里是和版本一的区别
reverse(s.begin() + len - n, s.end()); // 再反转后一段
reverse(s.begin(), s.end()); // 整体反转
cout << s << endl;
}