字符串在参加训练营之前就已经看过了,在已有的知识基础上去理解讲解,很快。现在来自己做一下。
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;
}
}
字符串总体是简单的,双指针就更简单了,我觉得双指针我能一天追三天的进度,嘿嘿。