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

344.反转字符串

初见想法:双指针

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


    }
};

一定要主要 i++ 和 j-- ,不要把i 也写成i--

541. 反转字符串II

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

        return s;
    }
};

初见想法很复杂,没想到可以直接使用reverse函数,也没想到可以这样用for函数

剑指offer 05.替换空格

class Solution {
public:
    string replaceSpace(string s) {
        int oldsize = s.size();
        int count = 0;
        for (int i = 0; i < oldsize; i++)
        {
            if (s[i] == ' ')
            {
                count++;
            }
        }

        s.resize(oldsize + 2*count);

        int i = oldsize, j = s.size();
        while (j > i)
        {
            if (s[i] == ' ')
            {
                s[j--] = '0';
                s[j--] = '2';
                s[j--] = '%';

                i--;
            }
            else
            {
                s[j--] = s[i--];
            }
        }

        return s;
    }
};
  1. 首先记录原string的大小和空格的数量,然后再对原string扩容

  1. 倒序遍历string, 当遇到空格时,倒序插入%20 直到两个指针相遇,代表着接下来不会再有空格了

151.翻转字符串里的单词

class Solution {
public:
    // 首先移除所有多余空格
    // 翻转整个string
    // 遍历整个字符串,翻转当个单词
    string reverseWords(string s) {

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

    void reverse(string &s, int start, int end)
    {
        while (start < end)
        {
            swap(s[start++], s[end--]);
        }
    }

    void removeExtraSpace(string &s)
    {
        int slow = 0;
        for (int i = 0; i < s.size(); i++)
        {
            // 遍历到一个新的单词
            if (s[i] != ' ')
            {
                // slow不为0,那么就不是第一个单词,前面加上' '
                if (slow != 0) s[slow++] = ' ';
                // 复制整个单词
                while (i < s.size() && s[i] != ' ')
                {
                    s[slow++] = s[i++];
                }
            }
        }
        // 假设slow的大小为n, string下标最多到n-1
        s.resize(slow);
    }
};
  1. 整个思路异常复杂,但是可以一步一步的解决,以后再写题的时候可以一步一步先把思路记下来

  1. 利用快慢指针把多余的空格去掉

剑指offer 58-II 左旋字符串

class Solution {
public:
    string reverseLeftWords(string s, int n) {

        int m = s.size()-1;
        reverse(s, 0, m);
        reverse(s, m-n+1, m);
        reverse(s, 0, m-n);
        return s;
    }

    void reverse(string &s, int start, int end)
    {
        while (start < end)
        {
            swap(s[start++], s[end--]);
        }
    }
};

先翻转整个string, 局部两个部分分别翻转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值