代码随想录算法训练营Day8 | 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串
344.反转字符串
题目链接:344.反转字符串
思路:
用双指针法
class Solution {
public:
void swap(char& a, char& b){
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
void reverseString(vector<char>& s) {
int i = 0;
int j = s.size()-1;
for (;i<j;i++,j--){
swap(s[i],s[j]);
}
}
};
注意 :
- swap函数可以用异或
- 双指针逼近中间
LeetCode 541. 反转字符串II
思路:
同样是反转,注意判断好边界条件,以2k为步长,判断剩余的是否小于k,两种情况。
class Solution {
public:
void reverse(string& s, int start, int end){
for (int i= start, j=end; i<j; i++, j--){
swap(s[i],s[j]);
}
}
string reverseStr(string s, int k) {
int l = s.length();
for(int i=0; i<l; i+=2*k){
if(l-i-1<k){
reverse(s, i, l-1);
}
else{
reverse(s, i, i+k-1);
}
}
return s;
}
};
注意 :
- 注意,自己实现的reverse函数为index
- 边界条件为i到i+k-1,表示第i+1个元素到第i+k个元素范围
卡码网 54.替换数字
题目链接:卡码网 54.替换数字
思路:
将数组扩充至s.size()+5*count数字
从后往前填充
#include <iostream>
using namespace std;
int main(){
string s;
while(cin>>s){
int count=0;
int i = 0;
for (;i<s.size();i++){
if(s[i]>='0' && s[i]<='9'){
count++;
}
}
i--;
s.resize(s.size()+count*5);
int j = s.size()-1;
for(; i>=0; i--){
if(s[i]>='0'&&s[i]<='9'){
s[j--]='r';
s[j--]='e';
s[j--]='b';
s[j--]='m';
s[j--]='u';
s[j--]='n';
}
else{
s[j--]=s[i];
}
}
cout<<s<<endl;
}
}
注意 :
- s.resize的用法
- 扩充5倍count
LeetCode 151.翻转字符串里的单词
思路:
1.去空格;
2.翻转字符串;
3.翻转单词;
class Solution {
public:
void swap(char& a, char& b){
a = a^b;
b = a^b;
a = a^b;
}
void removeSpaces(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);
}
void reverse(string& s, int start, int end){
int i = start;
int j = end;
for (; i<j; i++, j--){
swap(s[i], s[j]);
}
}
string reverseWords(string s) {
removeSpaces(s);
reverse(s, 0, s.size()-1);
int start = 0;
for(int i=0; i<=s.size(); i++){
if (i==s.size()|| s[i]==' '){
reverse(s, start, i-1);
start = i+1;
}
}
return s;
}
};
注意 :
- reverse空格前一个
- 去除空格的函数需要注意细节。
55.右旋转字符串
题目链接:55.右旋转字符串
思路:
分别 n和l-n翻转
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
string s;
cin >> n;
cin >> s;
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin()+n);
reverse(s.begin()+n, s.end());
cout << s << endl;
}
注意 :
- reverse()函数需要#include
2.需要三次翻转;