344.反转字符串
思路
简单的双指针交换问题
了解swap函数的用法交换s[i]与s[j]的使用方式为:swap(s[i],s[j])
题解
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size()-1;
while(left<right)
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
};
541.反转字符串II
题目链接:541.反转字符串II
文档讲解:代码随想录
状态:改了一遍轻松AC思路
典型的模拟题型,没有什么难度
弄清楚区间边界,对于复用代码封装好函数
题解
class Solution {
void reverse(string &s,int start,int end)
{
for(int left = start, right = end;left<right;left++,right--)
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
}
}
public:
string reverseStr(string s, int k) {
int i = 0;
while(true)
{
if(i+2*k>s.size())break;
reverse(s,i,i+k-1);
i+=2*k;
}
if(s.size()-i<k)reverse(s,i,s.size()-1);
else reverse(s,i,i+k-1);
return s;
}
};
54.替换数字
思路
简单方法不说了
双指针法:最开始想从前往后,像27题,数组复用的思想,但是本题明显number五个字母会覆盖有用的值
学习了容器扩大(学习了resize方法)后的从后往前双指针法(数组复用法),并得到重要结论,后一个指针一定不会追上前一个指针(不会产生覆盖)。
题解
#include <iostream>
#include <string>
using namespace std;
int main()
{
// string s("");
// string result("");
// cin>>s;
// for(int i = 0;i<s.size();i++)
// {
// if(s[i]<='9' && s[i]>='0')result += "number";
// else result += s[i];
// }
// cout<<result<<endl;
string s("");
string result("");
cin>>s;
int count = 0;
for(auto i:s)if(i<='9'&& i>='0')count++;
s.resize(s.size()+5*count);
int i = s.size()-5*count-1, j = s.size()-1;
for(;i>=0;i--,j--)
{
if(s[i]<='9'&& s[i]>='0')
{
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;
return 0;
}
