Bootstrap

代码随想录算法训练营第八天|344.反转字符串,541. 反转字符串II,卡码网:54.替换数字

字符串在参加训练营之前就已经看过了,在已有的知识基础上去理解讲解,很快。现在来自己做一下。

344.反转字符串

在这里插入图片描述

首先是卡哥的叮嘱

“对于这道题目一些同学直接用C++里的一个库函数 reverse,调一下直接完事了, 相信每一门编程语言都有这样的库函数。

如果这么做题的话,这样大家不会清楚反转字符串的实现原理了。

但是也不是说库函数就不能用,是要分场景的。

如果在现场面试中,我们什么时候使用库函数,什么时候不要用库函数呢?

如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。

毕竟面试官一定不是考察你对库函数的熟悉程度, 如果使用python和java 的同学更需要注意这一点,因为python、java提供的库函数十分丰富。

如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。”

所以在涉及到数组的倒转或者数组范围的查找,我很喜欢卡哥的双指针想法。并且在数组中,指针其实就相当于数组的下标,因此怎么方便怎么设置指针。

这题很简单,虽然在力扣上,不要怀疑自己,你想的就是对的。

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

没了

541. 反转字符串II

在这里插入图片描述
这边在设置if判断范围的时候,让我觉得很精妙的就是,卡哥设置的是If(i+k<s.size()),i是开始的位置,k是结束的位置,实际上判断这段阈值就可以了,而不用既判断前面有几个2k,后面剩下的有多少。给自己找麻烦。以下是代码:

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;
    }
};

卡码网:54.替换数字

aaaaaa登录之后为什么之前敲的不见了,不过好在最重要的部分是对的。但是卡玛网要自己考虑输入输出,这个我忽略了,这就是用力扣用习惯的不好的惯性。

#include <iostream>
using namespace std;
int main() {
    string s;
    while (cin >> s) {
        int sOldIndex = s.size() - 1;
        int count = 0; // 统计数字的个数
        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 sNewIndex = s.size() - 1;
        // 从后往前将数字替换为"number"
        while (sOldIndex >= 0) {
            if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
                s[sNewIndex--] = 'r';
                s[sNewIndex--] = 'e';
                s[sNewIndex--] = 'b';
                s[sNewIndex--] = 'm';
                s[sNewIndex--] = 'u';
                s[sNewIndex--] = 'n';
            } else {
                s[sNewIndex--] = s[sOldIndex];
            }
            sOldIndex--;
        }
        cout << s << endl;       
    }
}

字符串总体是简单的,双指针就更简单了,我觉得双指针我能一天追三天的进度,嘿嘿。

;