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

本文介绍了五道关于字符串操作的编程题目,包括反转字符串、反转字符串II、替换空格、翻转字符串里的单词以及左旋转字符串。文章通过示例代码展示了不同问题的解决方案,强调了解题思路和双指针法的应用。

代码随想录第八天||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;
    }
};

六、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值