1.反转字符串
要么调用库函数直接反转
要么通过左右指针自己转换
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(), s.end());
return;
}
};
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size() - 1;
while (left < right)
{
swap(s[left++], s[right--]);
}
}
};
2.反转字符串 II
题目描述抽象的很。意思:是前k个转,后k个不转,一次递推;最后一次旋转如果小于k,那么小于k个转
其实就分两种情况,满k个转和不满k个转
满k个转:跟上面逻辑一样
不满k个转:其实就是末尾元素,那么right是从末尾开始就行了
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k)
{
int left = i;
int right = i+k-1;
if(right>s.size()-1)
right = s.size()-1;
while(left<right)
{
swap(s[left++],s[right--]);
}
}
return s;
}
};
3.替换空格
了解stl的string用法就能轻松搞定
class Solution {
public:
string replaceSpace(string s) {
string ret;
for(auto e:s)
{
if(e==' ')
ret+="%20";
else
ret+=e;
}
return ret;
}
};
4.两次反转
1.先删除掉头尾空格和中间重复的空格
头部就判断s[0]是否为空格,尾部就判断s[s.size()-1]是否为空格,当中间s[i]是空格是s[i-1]是不是,如果成立就说明是重复需要删除
2.先将整体反转
3.再需要两个指针,一个指向开始要反转的位置,要么是开头要么是空格后;一个指向末尾要反转的位置后一个,要么是空格位置要么是s.size()位置
class Solution {
public:
void delSurBlk(string& s)
{
while(s[0]==' ')
{
s.erase(s.begin());
}
while(s[s.size()-1]==' ')
{
s.erase(s.end()-1);
}
for(int i=0;i<s.size();i++)
{
while(s[i]==' '&&s[i-1]==' ')
s.erase(s.begin()+i);
}
}
string reverseWords(string s) {
delSurBlk(s);
reverse(s.begin(),s.end());
int begin = 0 , end = 0;
while(end<s.size())
{
while(end<s.size()&&s[end]!=' ')
end++;
reverse(s.begin()+begin,s.begin()+end);
end++;
begin=end;
}
return s;
}
};
5.左旋转字符串
先整体转,再分两块转;重要的是中间的区间
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+(s.size()-n));
reverse(s.begin()+(s.size()-n),s.end());
return s;
}
};