思路:该题可以利用库函数解,但是要清楚库函数的原理,即会写这种库函数再去调用比较好,代码如下:
public:
void reverseString(vector<char>& s) {
int left=0;
int right=s.size()-1;
while(left<right){
swap(s[left],s[right]);
left++;
right--;
}
}
};
问题2:541. 反转字符串 II - 力扣(LeetCode)
思路:用一个for循环从大到小进行遍历,每次减去2*k,然后再结合题目中给的要求写if语句即可,代码如下:
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=s.size();i>0;i-=2*k){
if(i>=2*k){
for(int i=0,j=k-1;i<j;i++,j--){
swap(s[i],s[j]);
}
}
if((i-2*k)<k){
for(int i=2*k,j=s.size()-1;i<j;i++,j--){
swap(s[i],s[j]);
}
}
if(i<4*k && i>=3*k){
for(int i=2*k,j=3*k-1;i<j;i++,j--){
swap(s[i],s[j]);
}
}
}
return s;
}
};
问题3:剑指 Offer 05. 替换空格 - 力扣(LeetCode)
思路:首先把空格数统计出来,调整字符串的大小,然后从后往前对数组进行遍历,遇到空格即替换为指定值,代码如下:
class Solution {
public:
string replaceSpace(string s) {
int ans=0;
int old_size=s.size();
for(int i=0;i<s.size();i++){
if(s[i]==' ') ans++;
}
s.resize(s.size()+ans*2);
for(int i=s.size()-1,j=old_size-1;j<i;i--,j--){
if(s[j] != ' '){
s[i]=s[j];
}
else{
s[i]='0';
s[i-1]='2';
s[i-2]='%';
i-=2;
}
}
return s;
}
};
问题4:151. 反转字符串中的单词 - 力扣(LeetCode)
思路:首先清除字符串中多余的空格,即开头和结尾出的,后面的思路就是先整体反转字符串,然后再以空格为单位再次反转,注意细节,代码如下:
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]);
}
}
void RemoveExtra(string& s){
int slow=0;
for(int i=0;i<s.size();++i){
if(s[i] != ' '){
if(slow != 0) s[slow++]=' ';
while(i<s.size() && s[i] != ' '){
s[slow++]=s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
RemoveExtra(s);
reverse(s,0,s.size()-1);
int start=0;
for(int i=0;i<=s.size();++i){
if(s[i]==' ' || i==s.size()){
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
问题5:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)
思路:我一开始在用笨方法,一看结果直接被打击服了,太简单了。
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
reverse(s.begin(),s.end());
return s;
}
};