代码 随想录算法训练营第八天

代码随想录第八天||344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串

一、344. 反转字符串

题目链接
​ 该题思路比较简单,通过双指针法依次调换首尾字符顺序。

class Solution {
public:
    void reverseString(vector<char>& s) {
        char temp;
        int right = s.size()-1;
        int left = 0;
        while(left<right){
            temp = s[right];
            s[right] = s[left];
            s[left] = temp;
            left++;
            right--;
        }
    }
};

二、541. 反转字符串II

题目链接
自己做的思路上是对的,但是做得有点繁杂,不易懂且操作过多。

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.length();
        //if( n < k)  return s;
        int count = n / k;
        for(int i = 0; i <= count; i=i+2){
            for(int m = i*k, l = (((i+1)*k-1)<n?((i+1)*k-1):n-1); m<=(m+l)/2; m++,l--){
                swap(s[m],s[l]);
            }
        }
        return s;
    }
};

​ 看了carl哥讲解后的代码,简洁了不少,以后需要写个子函数把功能分开。

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]);
        }
    }
    string reverseStr(string s, int k) {
        for(int i = 0; i < s.size(); i=i+2*k){
            if( i+k <= s.size()){
                reverse(s,i,i+k-1);
            }
            else{
                reverse(s,i,s.size()-1);
            }
        }
        return s;
    }
};

三、剑指Offer 05.替换空格

题目链接
这题首先要重新设定一下字符串的长度,而遍历顺序的话如果从前先后遍历,则找到空格的时候则需要把后面的字符对应移动两位,时间复杂度为O( n 2 n^2 n2)。而从后向前遍历,则不需要移动前面的字符。时间复杂度为O( n n n);

class Solution {
public:
    string replaceSpace(string s) {
        int count = 0;
        for(auto c:s){
            if(c==' '){
                count++;
            }
        }
        s.resize(s.size() + count*2);
        for(int j = s.size()-1,i = s.size() -1 - count *2; i >= 0; i--,j--){
            if(s[i] != ' '){
                s[j] = s[i];
            }
            else{
                s[j--] = '0';
                s[j--] = '2';
                s[j] = '%';
            }
        }
        return s;
    }
};

四、151.翻转字符串里的单词

题目链接
这题比较困难,首先在思路上就没有理顺,看了Carl哥的解析,整体上思路算是比较清晰了,但我就是没想到。另一方面是每一次步骤的代码实现比较困难。但也是利用已经刷过的题的思路,没做出来实在不应该。看完答案后写的代码。

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 deletespace(string& s){
        int slow = 0;
        for(int i = 0; i<s.size();i++){
            if(s[i] != ' '){
                if(slow > 0)    s[slow++] = ' ';
                while(s[i] != ' ' && i<s.size()){
                    s[slow++] = s[i++];
                }
            }
        }
        s.resize(slow);
    }
    string reverseWords(string s) {
        deletespace(s);
        int n = s.size();
        reverse(s, 0, n-1);
        int start = 0;
        for(int i = 0; i <= n; i++){
            if(s[i] == ' ' || i == n){
                reverse(s, start, i-1);
                start = i+1;
            }
        }
        return s;
    }
};

五、剑指Offer58-II.左旋转字符串

题目链接
这题比较简单省时的方法没有想到,可以利用局部和整体的字符串反转来实现左旋转字符串。只写出了按出栈进栈思想的暴力解法。

暴力解法如下:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int m = s.size();
        for(int i = 0; i < n; i++){
            int temp = s[0];
            for(int j = 0; j < m-1; j++){
                s[j] = s[j+1];
            }
            s[m-1] = temp;
            
        }
        return s;
    }
};

局部和整体的字符串反转解法:

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

六、总结

​ 字符串的的定义和数据类型相对简单,难的是解题的思路与双指针法的应用。

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值