什么时候用库函数什么时候不用?
如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。
如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。
344.反转字符串
easy
class Solution {
public:void reverseString(vector<char>& s) {for (int i = 0, j = s.size() - 1; i < j; i++, j--) {swap(s[i],s[j]);}}
};
注意下for里多个元素的写法,用逗号隔开,不同部分用分号隔开
541. 反转字符串II
一开始写了一个有点错误的版本
class Solution {
public:string reverseStr(string s, int k) {int end;for(int i=0;i<s.size();i+=2*k){for(int p=i,q=i+k-1;p<q;p++,q--){swap(s[p],s[q]);}end=i;}int rest=s.size()%(2*k);if(rest==0){}else if(rest<=k){for(int p=end+1,q=s.size()-1;p<q;p++,q--){swap(s[p],s[q]);}}else{for(int p=end+1,q=end+k;p<q;p++,q--){swap(s[p],s[q]);}}return s;}
};
底下这一坨判断和重复代码就很不美观,而且还是错的,问了gpt帮我修改了一下
class Solution {
public:string reverseStr(string s, int k) {for (int i = 0; i < s.size(); i += 2 * k) {int left = i;int right = min(i + k - 1, (int)s.size() - 1);while (left < right) {swap(s[left], s[right]);left++;right--;}}return s;}
};
因为最后k<剩余字符串数量<2k时和一般情况是一样的,都是要反转k个字符串。特殊就是剩余字符串数量不到k的情况。加入一个取更小值就行了 int right = min(i + k - 1, (int)s.size() - 1);
卡码网54.替换数字
这个题创建一个结果string然后处理没啥难度,尝试在原字符串上进行操作并且不适用replace。
s.replace(i, i+1, “number”);
开始index,结束index,要换的字符串
tips:从前往后处理需要移动后面一坨剩余的,这时候从后往前就方便多了
#include<iostream>
#include<string>
using namespace std;int main(){string s;cin>>s;int ncnt=0;for(char c:s){if(c>='0'&&c<='9') ncnt++;}int end=s.size()-1;s.resize(s.size()+ncnt*5);int posi=s.size()-1;while(end>=0){if(s[end]>='0'&&s[end]<='9'){s[posi--] = 'r';s[posi--] = 'e';s[posi--] = 'b';s[posi--] = 'm';s[posi--] = 'u';s[posi--] = 'n';}else{s[posi--]=s[end];}end--;}cout<<s;return 0;
}