代码随想录算法训练营第8天| 344. 反转字符串、541. 反转字符串 II、54. 替换数字、151. 反转字符串中的单词、右旋字符串

344. 反转字符串

题目链接

344. 反转字符串 - 力扣(LeetCode)

思路

这道题用的是双指针思路,但是即使是二刷,我还是没想起来!!

本人题解

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

541. 反转字符串 II

题目链接

541. 反转字符串 II - 力扣(LeetCode)

思路

知道是模拟,但是理不清思路!

本人题解

class Solution {
public:
    void reverse(string& s, int i, int j) {
        while (i < j){
            swap(s[i], s[j]);
            i++;
            j--;
        }
    }
    string reverseStr(string s, int k) {
        //这道题应该是用的模拟的思路
        for (int i = 0; i < s.size(); i += (2 * k)) {
            if (i+k <= s.size()) {
                reverse(s, i, i+k-1);
                continue;
            }
            reverse(s, i, s.size()-1);
        }
        return s;
    }
};

54. 替换数字

题目链接

题目页面 (kamacoder.com)

思路

该题使用的是双指针思路,想到了,但是没有想的很明白。

本人题解

#include <iostream>
using namespace std;

int main () {
    string s;
    //这里为什么用一个while循环呢?
    while (cin >> s) {//等待输入完成,按回车键
        //统计输入的字符个数,统计输入的数字字数
        int count = 0;
        int oldSize = s.size();
        for (int i = 0; i < oldSize; i++) {
            if (s[i] > '0' && s[i] < '9') {
                count++;
            }
        }
        s.resize(oldSize + count * 5);
        int newSize = s.size();
        for (int i = newSize - 1, j = oldSize  - 1; j < i; i--, j--) {
            if (s[i] > '9' || s[i] < '0') {
                s[i] = s[j];
            }
            else {
                s[i] = 'r';
                s[i - 1] = 'e';
                s[i - 2] = 'b';
                s[i - 3] = 'm';
                s[i - 4] = 'u';
                s[i - 5] = 'n';
                i -= 5;
            }
        }
        cout << s << endl;
    }
    
}

151. 反转字符串中的单词

题目链接

151. 反转字符串中的单词 - 力扣(LeetCode)

思路

双指针法移除多余的空格,但是相对于移除元素并不简单!翻转整个字符串再翻转字符串中的单词

本人题解

class Solution {
public:
    void reverseStr(string &s, int i, int j) {
        //定义的是左闭右闭区间
        for (; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
    void removeElement(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);
    }
    string reverseWords(string s) {
        removeElement(s);
        reverseStr(s, 0, s.size()-1);
        int start = 0;
        for (int i = 0; i <= s.size(); i++) {
            if (i == s.size() || s[i] == ' ') {
                reverseStr(s, start, i - 1);
                start = i + 1;
            }
        }
        return s;
    }
};

右旋字符串

题目链接

题目页面 (kamacoder.com)

思路

这道题的思路和翻转字符串中的单词相似,首先翻转整个字符串,再翻转前后两段!

本人题解

#include <iostream>
using namespace std;
#include <string>

void reverseStr(string& s, int i, int j) {
    //作为一个左闭右闭区间
    for (; i < j; i++, j--) {
        swap(s[i], s[j]);
    }
}

int main () {
    int num;
    cin >> num;
    string s;
    while (cin >> s) {
        int n = s.size();
        reverseStr(s, 0, n - 1);
        reverseStr(s, 0, num - 1);
        reverseStr(s, num, n - 1);
    }
    cout << s <<endl;
}

 15min做完这题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值