Leetcode 344 反转字符串
采用对向双指针left=0,right=s.size()-1,
void reverseString(vector<char>& s) {
int left=0;
int right=s.size()-1;
while(left<right)
{
char temp=s[left];
s[left]=s[right];
s[right]=temp;
right--;
left++;
}
}
Leetcode 541 反转字符串Ⅱ
将题目看作一个2k的窗口,窗口每次滑动2k,对于不足2k的情况中的第二个,操作和正常移动一样,因此只需在每次移动后比较fast+k与s.size()的大小即可
string reverseStr(string s, int k) {
for(int fast=0;fast<s.size();fast+=2*k)
{
if(fast+k<s.size())
{
int left=fast;
int right=fast+k-1;
while(left<right)
{
char temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
if(fast+k>=s.size())
{
int left=fast;
int right=s.size()-1;
while(left<right)
{
char temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
}
return s;
}
Kamacoder 54.替换数字
之前好像看到过类似的题目?扩充字符串以后用right维护新字符串,oldRight遍历旧字符串
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
std::string s;
int numCount=0;
std::cin>>s;
int i=0;
for(i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
{
numCount++;
}
}
int oldRight=s.size()-1;
s.resize(s.size()-numCount+numCount*6);
int right=s.size()-1;
for(;oldRight>=0;oldRight--)
{
if(s[oldRight]>='0'&&s[oldRight]<='9')
{
s[right--]='r';
s[right--]='e';
s[right--]='b';
s[right--]='m';
s[right--]='u';
s[right--]='n';
}
else
{
s[right]=s[oldRight];
right--;
}
}
std::cout<<s<<std::endl;
}
浙公网安备 33010602011771号