151.反转字符串中的单词|541.反转字符串2|344.反转字符串|kama54.替换数字|kama55.右旋字符串

  • 344.反转字符串
    • 注意到遍历指针应该只到数组中部,即(小于s.size()/2)
    • 或直接使用swap()库函数
class Solution {
public:
    void reverseString(vector<char>& s) {
        char tmp;
        int work = s.size() - 1;
        for (int i = 0; i < s.size() / 2; i++) {
            tmp = s[i];
            s[i] = s[work];
            s[work--] = tmp;
        }
    }
};
  • 541.反转字符串2
    • 迭代器的使用,第一想法是使用int型计数,但reverse()要传入地址
    • 补充:上条傻了,无需计数器,只需在循环表达式上做出修改即可,且也不用非用迭代器(第二块代码来源:代码随想录)
    • 需要注意的是定义迭代器是要赋初值,否则会报空指针异常
    • 注意,循环体中各分支对于循环变量的改变,以保证正常退出循环
class Solution {
public:
    string reverseStr(string s, int k) {
        // int count = 0;
        string ::iterator c = s.begin();
        while (c != s.end()){
           if (s.end() - c < k) {
                reverse(c, s.end()); 
                break;
           }else if (s.end() - c >= k && s.end() - c < 2*k) {
               reverse(c, c + k);
               break;
           }else {
               reverse(c, c + k);
               c += 2 * k; 
           }

        }
        return s;


    }
};
class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); 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;
    }
};
  • cama54.替换数字
    • 逆天编译器
    • 双指针or暴力replace()
    • string、vector、queue支持resize()改变长度
#include<iostream>
using namespace std;
int main() {
    string s;
    while (cin >> s) {
        int count = 0; // 统计数字的个数
        int sOldSize = s.size();
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                count++;
            }
        }
        // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
        s.resize(s.size() + count * 5);
        int sNewSize = s.size();
        // 从后先前将空格替换为"number"
        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;
    }
}
#include<iostream>
using namespace std;
#include<string>

int main() {
    string str;
    cin >> str;
    for (int i = 0; i < str.size(); i++) {
        if (str[i] < 'a') {
            str.replace(i, 1, "number");
            i += 5;
        }
    }
    cout << str;
    return 0;
}
  • 151.翻转字符串中的单词
    • 很多细节点没有考虑到
    • 双指针的再度运用(其中,对于removeBadVolume中的if(slow!=0)时的操作逻辑要特别注意和学习,改成注释那样会多空格,只slow++会出现错误,eg“空格空格hello空格world空格空格”会错误输出为“hellolworld”)
class Solution {
public:

        void reverseString (string &s, int l, int r) {
            for (int i = l, j = r; i < j; i++, j--) {
                swap(s[i], s[j]);
            }
        }   

        void removeBadVolume (string &s) {
            int slow = 0;
            for (int fast = 0; fast < s.size(); fast++) {
                if (s[fast] != ' '){
                   if (slow != 0) {
                        // s.insert(slow, " ");
                        // slow++;
                        s[slow++] = ' ';
                    }
                    while (fast < s.size() && s[fast] != ' ') {
                        s[slow++] = s[fast++];
                    }
                }  
            }
            s.resize(slow);
        }

        string reverseWords(string &s) {
            removeBadVolume(s);
            reverseString(s, 0, s.size() - 1);
            int l = 0, r = s.size() - 1;
            for (int i = 0; i <= s.size(); i++) {//注意:应该是小于等于而不是小于,若小于,最后一个单词无法反转
                if (i == s.size() || s[i] == ' ') {
                    r = i - 1;
                    reverseString(s, l, r);   
                    //l忘记更新
                    l = r + 2;
                }
                // }else if (l != 0 && s[i] == ' ') {
                //     r = i - 1;
                //     reverseString(s, l, r);
                //     l = r + 2;
                // }
            }
            return s;
        }
    
};
  • kama55.右旋字符串
    • 思路并不难
    • 随想录增设了如下条件:不能申请额外空间,只能在本串上操作。是对以往思路的重新复习:整体翻转,再局部翻转
  • 常规
#include<iostream>
#include<string>

using namespace std;
int main () {
    string s, str;
    int k;
    cin>>k>>s;
    for (int i = s.size() - k; i < s.size(); i++) {
        str += s[i];
    }
    s.resize(s.size() - k);
    s = str + s;
    cout<<s;
    
    
}
  • sxl
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int n;
    string s;
    cin >> n;
    cin >> s;
    int len = s.size(); //获取长度
    reverse(s.begin(), s.end()); // 整体反转
    reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
    reverse(s.begin() + n, s.end()); // 再反转后一段

    cout << s << endl;

} 
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值