代码随想录算法训练营day8 || ● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符串

问题1:344. 反转字符串 - 力扣(LeetCode)

思路:该题可以利用库函数解,但是要清楚库函数的原理,即会写这种库函数再去调用比较好,代码如下:

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;
        }
};

猜你喜欢

转载自blog.csdn.net/weixin_56969073/article/details/132438931