代码随想录算法训练营Day8|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

344.反转字符串

题目链接:344.反转字符串
文档链接:344.反转字符串
视频链接:字符串基础操作! | LeetCode:344.反转字符串

C++实现

class Solution {
public:
    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;
            left++;
            right--;
        }
    }
};

541. 反转字符串II

题目链接:541. 反转字符串II
文档链接:541. 反转字符串II
视频链接:字符串操作进阶! | LeetCode:541. 反转字符串II

C++实现

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i=0;i<s.size();i+=2*k){
            if(i+k<s.size()){
                reverse(s.begin()+i,s.begin()+i+k);
            }
            else{
                reverse(s.begin()+i,s.end());
            }            
        }
        return s;
    }
};

卡码网:54.替换数字

题目链接:卡码网:54.替换数字
文档链接:卡码网:54.替换数字

C++实现

#include
using namespace std;
int main(){
    string s;
    cin>>s;
    int count = 0;
    int oldlen = s.size();
    for(int i = 0; i < s.size(); i++){
        if(s[i]>='0'&&s[i]<='9'){
            count++;
        }
    }
    s.resize(s.size()+5*count);
    int newlen = s.size();
    int i = newlen-1;
    int j = oldlen-1;
    while(j<i){
        if(s[j]>'9'||s[j]<0){
            s[i]=s[j];
            i--;
            j--;
        }
        else{
            s[i--]='r';
            s[i--]='e';
            s[i--]='b';
            s[i--]='m';
            s[i--]='u';
            s[i--]='n';
            j--;
        }        
    }
    cout<<s<<endl;
    return 0;

151.翻转字符串里的单词

题目链接:151.翻转字符串里的单词
文档链接:151.翻转字符串里的单词
视频链接:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词

C++实现

class Solution {
public:
    void reverse(string &s, int start, int end){
        int i = start;
        int j = end;
        while(i<j){
            char temp = s[i];
            s[i]=s[j];
            s[j]=temp;
            i++;
            j--;
        }
    }
    void RemoveExtraSpaces(string &s){
        int index = 0;
        for(int i = 0; i<s.size(); i++){
            if(s[i]!=' '){
                if(index != 0) s[index++] = ' ';
                while(i<s.size()&&s[i]!=' '){
                    s[index++] = s[i++];
                }
            }
        }
        s.resize(index);
    }
    string reverseWords(string s) {
        RemoveExtraSpaces(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;
    }
};

卡码网:55.右旋转字符串

题目链接:卡码网:55.右旋转字符串
文档链接:卡码网:55.右旋转字符串

C++实现

#include
using namespace std;
void reverse(string &s, int start, int end){
    int i = start;
    int j = end;
    while(i<j){
        char temp = s[i];
        s[i]=s[j];
        s[j]=temp;
        i++;
        j--;
    }
}
int main(){
    int n;
    string s;
    cin>>n;
    cin>>s;
    
    reverse(s,0,s.size()-1);
    reverse(s,0,n-1);
    reverse(s,n,s.size()-1);
    
    cout<<s<<endl;
    
    return 0;
}

总结

  1. reverse是很多操作的基础,注意左闭右闭;
  2. 541题中长度不超过2k但大于k的操作与长度等于2k可以归为一类;
  3. 进一步理解双指针法的运用;
  4. 151题中最后一个字母在反转的范围内,所以i可以取到s.size();
  5. 学习最后一题思路。

你可能感兴趣的:(算法训练,算法)