344.反转字符串
char数组
[‘q’,‘w’,‘e’,‘r’]
本来想着新定义一个数组倒着装进去就完了,以空间换时间
卡哥的双指针太妙了
只能说学的少,见的也少,习惯里还没有双指针这个思路
class Solution {
public:
void reverseString(vector<char>& s)
{
for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--)
{
//从开始和末端操作指针做交换
//交换次数,6个就换三次,5个就换两次,中间的字符不用动
swap(s[i],s[j]);
}
}
};
541. 反转字符串II
代码控制和流程控制最能体现的一集
题目:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
对于前2k,也就是abcd,满足2k个,反转前k个,也就是ba
对于后边的efg,不满足2k个,那么就反转前k个,也就是ef
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= s.size()) {
reverse(s.begin() + i, s.begin() + i + k );
} else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
替换数字
a1b2
把数字替换成number
我的想法是新定义数组,因为替换的大小确定,而且被替换的字符也是确定的,所以可以计算替换词的大小,先把要保留的字符给移动到给定位置
比如a1b2
a不动,b移动到1*5+1的位置
然后把字符串进行填充,但是我的想法依然是正向填充,时间上还是o2
卡哥的思想是从后往前填充,新旧数组之间就可以用覆盖来进行替换,是o1的复杂度
但是我现在想把替换词写成变量,这样的话也将是o2的复杂度
#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.size()
s.resize(s.size() + count * s.size() );
//记录新的字符串大小
int sNewIndex = s.size() - 1;
// 从后往前将数字替换为"number"
while (sOldIndex >= 0) {
//0-9 数字直接进行替换 从后往前
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
//填充字符串number
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;
}
}