算法刷题Day 8 反转字符串+反转字符串II+替换空格+反转字符串中的单词+左旋转字符串

Day 8 字符串

344. 反转字符串

很经典的双指针算法

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

        while (left < right)
        {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }
};

541. 反转字符串II

虽然一次通过了,但是感觉写的很不优雅

class Solution {
    void reverseSubStr(string &s, int left, int right)
    {
        --right;
        while (left < right)
        {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }

public:
    string reverseStr(string s, int k) {
        int left = 0, right = k, step = 2 * k, len = s.size();

        while (left < len && right <= len)
        {
            reverseSubStr(s, left, right);
            left += step;
            right += step;
        }

        if (left < len)
        {
            reverseSubStr(s, left, len);
        }

        return s;
    }
};

更加优雅的写法

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

剑指Offer 05. 替换空格

class Solution {
public:
    string replaceSpace(string s) {
        string ret;
        ret.reserve(s.size() * 3);
        for (auto c : s)
        {
            if (c == ' ')
            {
                ret.push_back('%');
                ret.push_back('2');
                ret.push_back('0');
            }
            else
            {
                ret.push_back(c);
            }
        }
        ret.shrink_to_fit();
        return ret;
    }
};

151.反转字符串中的单词

没审清题意,写了一个没有合并空白字符的版本,勉强把它记下来

class Solution {
    void reverseSubStr(string &s, int start, int end)
    {
        --end;
        while (start < end)
        {
            char tmp = s[start];
            s[start] = s[end];
            s[end] = tmp;
            start++;
            end--;
        }
    }

public:
    string reverseWords(string s) {
        int start = 0, end = 0;

        while (end < s.size())
        {
            if (s[end] == ' ')
            {
                reverseSubStr(s, start, end);
                while (s[end] == ' ') end++;
                start = end;
            }
            else
            {
                end++;
            }
        }
        reverseSubStr(s, start, end);
        reverse(s.begin(), s.end());

        return s;
    }
};

case1
case2

三个步骤:

  • 清除多余的空格
  • 反转每一个单词
  • 反转整个字符串

步骤很重要,如果想把前两步混在一起做,会变得非常麻烦。

清除多余的空格

void removeWhiteSpace(string &s)
{
    // 清除多余的空格
    int left = 0, right = 0;
    while (s[right] == ' ') right++;
    while (right < s.size())
    {
        if (s[right] == ' ')
        {
            while (right < s.size() && s[right] == ' ') right++;
            if (right < s.size())
            {
                s[left++] = ' ';
            }
        }
        else
        {
            s[left++] = s[right++];
        }
    }
    s.erase(s.begin() + left, s.end());

    return s;
}

整体代码

class Solution {
public:
    string reverseWords(string s) {
        // 清除多余的空格
        int left = 0, right = 0;
        while (s[right] == ' ') right++;
        while (right < s.size())
        {
            if (s[right] == ' ')
            {
                while (right < s.size() && s[right] == ' ') right++;
                if (right < s.size())
                {
                    s[left++] = ' ';
                }
            }
            else
            {
                s[left++] = s[right++];
            }
        }
        s.erase(s.begin() + left, s.end());

        left = 0, right = 0;
        while (right < s.size())
        {
            if (s[right] == ' ')
            {
                reverse(s.begin() + left, s.begin() + right);
                right++;
                left = right;
            }
            else
            {
                right++;
            }
        }

        reverse(s.begin() + left, s.end());
        reverse(s.begin(), s.end());

        return s;
    }
};

剑指 Offer 58 - II. 左旋转字符串

基操

class Solution {
    void reverseSubStr(string &s, int left, int right)
    {
        right--;
        while (left < right)
        {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }

public:
    string reverseLeftWords(string s, int n) {
        reverseSubStr(s, 0, n);
        reverseSubStr(s, n, s.size());
        reverse(s.begin(), s.end());

        return s;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值