344、反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
char tem;
int length = s.size();
for(int i = 0; i < length/2; i++) {
tem = s[i];
s[i] = s[length-i-1];
s[length-i-1] = tem;
}
}
};
时间复杂度:O(n)
空间复杂度:O(1)
541、反转字符串 II
class Solution {
public:
string reverseStr(string s, int k) {
int length = s.size();
int i = 0,j = k - 1;
for(; j < length; i += 2*k, j += 2*k) {
swap(s, i, j);
}
if(i < length-1) {
swap(s, i, length - 1);
}
return s;
}
void swap(string& s, int l, int r) {
char tem;
for(int i = l, j = r; i < j; i++, j--) {
tem = s[i];
s[i] = s[j];
s[j] = tem;
}
}
};
时间复杂度:O(n)
空间复杂度:O(1)
54、替换数字
resize()函数:扩容vector的大小,不会改变容量
语法:
void resize(size_t count); //扩容为 count 大小;
void resize(size_t count, const T& value); //扩容为 count 大小,新元素初始化为 value;
双指针:
分别指向新旧数组的最后一个元素,从后往前遍历,遇到字母复制,遇到数字填充number。从后往前遍历可以减少元素移动次数。
#include <iostream>
using namespace std;
int main() {
string s;
while(cin >> s) {
int count = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] >= '0' && s[i] <= '9') {
count++;
}
}
int left = s.size() - 1;
s.resize(s.size() + count * 5);
int right = s.size() - 1;
while(right >= 0) {
if(s[left] >= '0' && s[left] <= '9') {
s[right--] = 'r';
s[right--] = 'e';
s[right--] = 'b';
s[right--] = 'm';
s[right--] = 'u';
s[right--] = 'n';
}else {
s[right--] = s[left];
}
left--;
}
cout << s <<endl;
}
}
时间复杂度:O(n)
空间复杂度:O(1)