344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
题目链接:LeetCode344.反转字符串
文档讲解:代码随想录344.反转字符串
题解
双指针法,更新头尾指针并依次交换指向的字符
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]);
}
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
题目链接:LeetCode541.反转字符串II
文档讲解:代码随想录541.反转字符串II
题解
根据题意利用reverse库函数模拟过程
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);
} else {
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
卡码网54. 替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
题目链接:卡码网54.替换数字
文档讲解:代码随想录卡码网54.替换数字
题解
双指针法,分别遍历旧字符串和新字符串
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int oldIndex = s.size() - 1;
int cntNumber = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
cntNumber++;
}
}
s.resize(s.size() + cntNumber * 5);
int newIndex = s.size() - 1;
while (oldIndex >= 0) {
if (s[oldIndex] >= '0' && s[oldIndex] <= '9') {
s[newIndex--] = 'r';
s[newIndex--] = 'e';
s[newIndex--] = 'b';
s[newIndex--] = 'm';
s[newIndex--] = 'u';
s[newIndex--] = 'n';
} else {
s[newIndex--] = s[oldIndex];
}
oldIndex--;
}
cout << s << endl;
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
利用isdigit()库函数判断字符是否为数字
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
string res;
for (char c:s) {
if (isdigit(c)) {
res += "number";
}else{
res += c;
}
}
cout << res << endl;
}
}