344.反转字符串
思路:前后指针。前指针向后遍历,后指针向前遍历,交换这两个数。
时间复杂度:O(n)
空间复杂度:O(1)
代码实现:
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size() - 1;
while(left < right){
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
};
541. 反转字符
思路:在上一题的基础上加一些条件判断。
时间复杂度:O(n)
空间复杂度:O(1)
注意:
1.当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。本题i = i + (2 * k)语句很巧妙。
2.实现基本的反转字符串不是本题的核心代码,因此本题可以使用库函数,也可以自己写一个reverse函数。
3.C++的reverse库函数写法:
reverse(s.begin(), s.end());
代码实现:
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += 2 * k){
//如果剩余字符大于等于k个
if(i + k - 1 < s.size()){
reverse(s.begin() + i, s.begin() + i + k);
}
//如果剩余字符不足k个
else{
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
卡码网:54.替换数字
思路:双指针。用两个指针,一前一后,两个指针都向前走,前指针用来遍历旧的s,后指针用来写入已经确定的新s的内容。
时间复杂度:O(n)
空间复杂度:O(1)
代码实现:
#include <iostream>
using namespace std;
int main() {
string s;
//输入一个字符串到s,在输入的同时统计s中数字的个数
while (cin >> s) {
int front = s.size() - 1;
int count = 0; // 统计数字的个数
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
//更改s的大小
s.resize(s.size() + count * 5);
int rear = s.size() - 1;
while(front >= 0){
if(s[front] >= '0' && s[front] <= '9'){
s[rear--] = 'r';
s[rear--] = 'e';
s[rear--] = 'b';
s[rear--] = 'm';
s[rear--] = 'u';
s[rear--] = 'n';
}
else{
s[rear--] = s[front];
}
front--;
}
//打印输出字符串
cout<<s<<endl;
}
return 0;
}