代码随想录算法训练营第八天 | 344.反转字符串,541.反转字符串ii,卡码网54.替换数字 151.翻转字符串里的单词 卡码网55.右旋转字符串 ACM格式 C++

文章介绍了几个关于字符串操作的C++函数,包括反转整个字符串、每2k个字符反转前k个字符、替换数字为特定字符序列以及翻转单词和进行右旋操作,所有函数都在原地修改输入数组,节省空间。
摘要由CSDN通过智能技术生成

344.翻转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

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

// 主函数
int main() {
    Solution solution;
    vector<char> s = { 'h','e','l','l','o'};
    /*
    string input;
    cin >> input;
    vector<char> s(input.begin(), input.end());
    */
    solution.reverseString(s);
    for (char c : s) {
        cout << c;
    }
    return 0;
}

541.反转字符串ii

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution {
public:
    string reverseString(string s, int k) {
        for (int i = 0; i < s.length(); i += (2 * k)) {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= s.size()) {
                reverse(s.begin() + i, s.begin() + i + k);
            }
            else {
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};

// 主函数
int main() {
    Solution solution;
    string s = "abcdefg";
    int k = 2;
    string a = solution.reverseString(s, k);
    for (char c : a) {
        cout << c;
    }
    return 0;
}

54.替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


// 主函数
int main() {
    string s;
    while (cin >> s) {
        int count = 0;
        int sOldSize = s.length();
        for (int i = 0; i < s.length(); i++) {
            if (s[i] >= '0' && s[i] <= '9')count++;
        }
        s.resize(s.length() + count * 5);
        int sNewSize = s.length();
        for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
            if (s[j] > '9' || s[j] < '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;
    }
    return 0;
}

151.翻转字符串里的单词(重点)

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: “the sky is blue”
输出: “blue is sky the”

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
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 removeExtraSpace(string& s) {
        int slow = 0;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] != ' ') {
                if (slow != 0) s[slow++] = ' ';
                while (i < s.size() && s[i] != ' ') {
                    s[slow++] = s[i++];
                }

            }
        }
        s.resize(slow);
    }
    
    string reverseWorlds(string s) {
        removeExtraSpace(s);
        reverse(s, 0, s.size() - 1);
        int start = 0;
        for (int i = 0; i <= s.size(); ++i) {
            if (i == s.size() || s[i] == ' ') {
                reverse(s, start, i - 1);
                start = i + 1;
            }
        }
        return s;
    }
};

// 主函数
int main() {
    string s = " the sky is blue";
    Solution solution;
    cout << solution.reverseWorlds(s) << endl;
    return 0;
}

右旋字符串

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


// 主函数
int main() {
    int n;
    string s;
    cin >> n;
    cin >> s;
    int len = s.length();
    reverse(s.begin(), s.end());
    reverse(s.begin(), s.begin() + n);
    reverse(s.begin() + n, s.end());
    cout << s << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值