@代码随想录@程序员Carl
题目和代码和讲解链接:第四章符串part01 (qq.com)
344.反转字符串
我的知识盲点,
1.异或操作 ^=
2.
for(int i=0,j=2;;) //初始化j不用加int了
541. 反转字符串II
class Solution{
public:
string reverseStr(string s,int k){
for(int i=0;i<s.size();i+=2*k){
if(i+k<s.size()){
reverse(s.begin()+i,s.begin()+i+k);
continue;
}
reverse(s.begin()+i,s.end());
}
return s;
}
};
卡码网:54.替换数字
盲点:我连字符串怎么输入都不会了emm
while循环,输入Ctrl+Z跳出。
这道题写了好久,麻了。双指针法,先扩充string,然后从后往前改变string。如果从前往后的话,那时间复杂度就是O()。
#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;
}
}
151.翻转字符串里的单词
我觉得这题挺难的,过一段时间二刷可(ken)能(ding)写不出来。
用库函数split先拆分成一个个单词,再将单词倒序输入到一个字符串里。但是这样做就没有什么练习的意义了。所以练习时要求空间复杂度是O(1),同时不去使用split库函数。
不要用for循环加上erase函数,因为erase函数的时间复杂度是O(n),加上for循环时间复杂度就是O() 。
我的盲点:erase函数
以下是我的代码,和代码随想录网站上的略有不同,我用的是C++库的reverse函数:
class Solution {
public:
//去掉多余的空格
void eraseExtraSpace(string& s){ //传入地址就不用return了
int slow = 0;
for(int i = 0;i<s.size();++i){
if(s[i]!=' '){
if(slow!=0){
s[slow++]=' ';
}
while(i<s.size() && s[i]!=' '){
s[slow++] = s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
eraseExtraSpace(s);
//先把string整体反转
reverse(s.begin(),s.end());
//再反转单词
//reverse库函数是左闭右开
int start = 0;
for(int i=0;i<=s.size();++i){
if(i==s.size() || s[i]==' '){
reverse(s.begin()+start,s.begin()+i);
start = i+1;
}
}
return s;
}
};
时间复杂度O(n),空间复杂度O(1)。
卡码网:55.右旋转字符串
大体思路和上面那题差不多,分为反转整体和反转局部两个部分。
这道题还挺简单的,就是algorithm拼写错误