344.反转字符串
字符串本质还是放在一个连续的数组里,所以反转出现立马就想到调用栈(FILO)
class Solution {
public:
void reverseString(vector<char>& s) {
stack<char> stk(s.begin(),s.end());
for(auto &a:s) {
a = stk.top();
stk.pop();
}
}
};
看了答案直接调用reverse函数即可
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
};
541. 反转字符串II
从”每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符“可看出要建立以2k为区间的循环;
再结合上一道题分不同的情况得出答案。
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
for(int i = 0; i < n; i+=2*k) {
if(i + k > n) {//剩余字符串少于k个
reverse(s.begin() + i, s.end());
}else {
reverse(s.begin() + i, s.begin() + i + k);
}
}
return s;
}
};
卡码网:54.替换数字
题目要求把数字换成number,则创建一个字符串然后进行拼接。这里使用了额外的开销,还可以试试原地修改,但是代码会复杂一些。
#include <iostream>
#include <string>
using namespace std;
bool isNumber(char a) {
if(a >= '1' && a <= '9')
return true;
return false;
}
int main() {
string s;
cin >> s;
string res;
for(int i = 0; i < s.size(); ++i) {
if(isNumber(s[i]))
res+="number";
else
res+=s[i];
}
cout <<res << endl;
}
原地修改: 这里使用了replace函数,避免额外创建新字符串,但是整体时间竟然没有节约多少。因为replace函数放在循环中,每次都要改变size然后把向后移动元素。所以更好的做法是多次扩容变成一次扩容,再从后向前操作。
#include <iostream>
#include <string>
using namespace std;
bool isNumber(char a) {
if(a >= '1' && a <= '9')
return true;
return false;
}
int main() {
string s;
cin >> s;
for(int i = 0; i < s.size(); ++i) {
if(isNumber(s[i])) {
s.replace(i, 1, "number");
i += 5;
}
}
cout << s << endl;
}
代码随想录使用从后向前填充,这个时间耗时最少。重要:先预先给数组扩容带填充后的大小,然后在从后向前进行操作
#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;
}
}