代码随想录训练营第八天|LeetCode 344、541、151、剑指Offer 05、剑指Offer58-II

LeetCode 344反转字符串

题目链接:344. 反转字符串 - 力扣(LeetCode)

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

LeetCode 541反转字符串II

题目链接:541. 反转字符串 II - 力扣(LeetCode)

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2 * k) {
            if (i + k - 1 < s.size()) {
                reverse(s.begin() + i, s.begin() + i + k);//反转s[i]、s[i + k -1]之间的部分
            }
            else {
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};

剑指Offer 05替换空格

题目链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)

  • 自己写的,因为插入操作,效率低

class Solution {
public:
    string replaceSpace(string s) {
        int n = s.size();
        int i = n - 1;
        while (i >= 0) {
            if (s[i] == ' ') {
                s[i] = '0';
                s.insert(s.begin() + i, '2');
                s.insert(s.begin() + i, '%');
            }
            --i;
        }
        return s;
    }
};
  • 双指针法

class Solution {
public:
    string replaceSpace(string s) {
        int count = 0; //记录s中空格的个数
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] == ' ') count++;
        }
        int i = s.size() - 1;
        //扩展s的存储空间,没一个空格就要多出两个格子来存数据
        s.resize(s.size() + 2 * count);
        int j = s.size() - 1;
        while (i >= 0 && i <= j) {
            if (s[i] == ' ') {
                s[j] = '0';
                s[j - 1] = '2';
                s[j - 2] = '%';
                i--;
                j -= 3;
            }
            else {
                s[j] = s[i];
                i--;
                j--;
            }
        }
        return s;
    }
};

LeetCode 151反转字符串里的单词

题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)

  • 思路就是:先去除多余空格、将字符串全部反转、再将字符串局部反转

//自己写的有点复杂,没有优化的代码
class Solution {
public:
    string reverseWords(string s) {
        //去除多余空格
        int i = 0, j = 0;
        while (i <= j && j < s.size()) {
            if ((j == 0 && s[j] == ' ') || (j > 0 && s[j] == ' ' && s[j] == s[j - 1])) ++j;
            else {
                s[i] = s[j];
                ++i, ++j;
            }
        }
        if (s[i - 1] == ' ') s.resize(i - 1);
        else s.resize(i);
        //整体反转
        reverse(s.begin(), s.end());
        //局部反转
        int k = 0, l = 0;
        while (k <= l && l < s.size()) {
            while (l < s.size() && s[l] != ' ') ++l;
            if (l < s.size()) {
                reverse(s.begin() + k, s.begin() + l);
                ++l;
                k = l;
            }
            else {
                reverse(s.begin() + k, s.end());
            }
        }
        return s;
    }
};
//优化后的代码
class Solution {
private:
    //去除多余空格
    void removeExtraSpaces(string& s) {
        int slow = 0;
        for (int fast = 0; fast < s.size(); ++fast) {
            if (s[fast] != ' ') {//去除全部空格
                if (slow > 0) s[slow++] = ' ';//在每两个单词中间加上空格
                while (fast < s.size() && s[fast] != ' ') {
                    s[slow++] = s[fast++];
                }
            }
        }
        s.resize(slow);
    }
public:
    string reverseWords(string s) {
        //去除多余空格
        removeExtraSpaces(s);
        //整体反转
        reverse(s.begin(), s.end());
        //局部反转
        int i = 0;
        for (int j = 0; j <= s.size(); ++j) {
            if (s[j] == ' ' || j == s.size()) {
                reverse(s.begin() + i, s.begin() + j);
                i = j + 1;
            }
        }
        return s;
    }
};

剑指Offer58-II左旋转字符串

题目链接:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)

  • 第一反应的傻瓜做法

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int len = s.size();
        for (int i = 0; i < n; ++i) {
            s.insert(s.end(), s[i]);
        }
        for (int i = 0, j = n; j < s.size(); ++i, ++j) {
            s[i] = s[j];
        }
        s.resize(len);
        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、付费专栏及课程。

余额充值