day8 字符串第一章

344 反转字符串

思路:使用两个指针一前一尾,逐个交换即可

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

541. 反转字符串II

思路:我们要反转的字符数在2k的前k个,对于那段字符的起始下标,就是从0->2k->4k...,在翻转的过程中可能会遇到字符串个数不够的情况,判断一下够不够然后再进行翻转。

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

卡码网:54.替换数字

这题我直接偷懒了,遇到数字就输出"number"否则输出s[i]

#include <iostream>
#include <string>
using namespace std;
string nu = "number";
int main() {
    string s;
    cin >> s;
    for(int i = 0; i < s.size();++i) {
        if(s[i] >= '0' && s[i] <= '9') {
            cout << nu;
        }
        else {
            cout << s[i];
        }
    }
    return 0;
}

151.翻转字符串里的单词

这种类型的题目都可以使用一个简单的处理方法,就是把参数string当作是你的输入流,然后直接让库函数去处理空格的关系,我们直接使用stringstream然后用这个作为输入流,需要根据空格转化成什么类型就用什么类型的参数接收。

class Solution {
public:
    string reverseWords(string s) {
        stringstream ss(s);
        vector<string> t;
        string tmp;
        while(ss >> tmp) {
            //cout << tmp << "\n";
            t.push_back(tmp);
        }
        string ans = "";
        int i;
        for(i = t.size() - 1; i > 0; --i) {
            ans+= t[i];
            ans+= " ";
        }
        ans += t[i]; // 避免多一个空格
        return ans;
    }
};

对比卡哥的思路,这个思路有点偷鸡的感觉(
但是代码会简洁很多,思路上也简洁很多。

卡码网:55.右旋转字符串

这题直接模拟,但是应该会有更高效的思路,等有空再看看(

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

string rev(string& s, int k) {
    string ret = "";
    for(int i = s.size() - k; i < s.size(); ++i) {
        ret += s[i];
    }
    for(int i = 0; i < s.size() - k; i++) {
        ret += s[i];
    }
    return ret;
}

int main() {
    int k;
    cin >> k;
    string s;
    cin >> s;
    cout << rev(s, k);
    return 0;
}
posted @ 2024-01-05 10:54  ccnju  阅读(8)  评论(0)    收藏  举报