思路:分别从头从尾遍历,双指针逼近中间元素,然后左指针和右指针的元素对换
代码:
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0,j = s.size() - 1;i <= (s.size() - 1) / 2;i++,j--)
{
swap(s[i],s[j]);
}
}
};
思路:定义pos为当前的元素下标,pos每次移动2k个单位,然后判断剩余数组长度和k比较
代码:
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size(),pos = 0;
while(pos < n)
{
if(n - pos >= k) reverse(s.begin() + pos,s.begin() + pos + k);
else reverse(s.begin() + pos, s.end());
pos += 2 * k;
}
return s;
}
};
54. 替换数字(第八期模拟笔试) (kamacoder.com)
思路:直接利用replace函数,替换数字s.replace(索引,需要替换的元素长度,需要替换的值)
代码:
1.暴力
#include<iostream>
using namespace std;
#include<string>
int main(){
string s;
cin >> s;
for(int i = 0; i < s.size();i++)
{
if(s[i] < 'a')
{
s.replace(i,1,"number");//string的替换函数,i是元素下标,1是该元素后的多少个数字,最后是需要替换的元素
i += 5;
}
}
cout << s;
return 0;
}
2.双指针
思路:先开辟一个包含了替换数字后的最大数组,然后从后往前依次填充,需要注意如果从前往后填充,每次填完后面的数字都要移动,复杂度是n^2。其次需要注意old和new指针应该同时处于相同长度的数组中进行移动否则有索引溢出的风险。
#include<iostream>
using namespace std;
#include<string>
int main(){
string s;
cin >> s;
int num = 0;
for(int i = 0; i < s.size();i++)
{
if(s[i] >= '0' && s[i] <= '9') num++;
}
s.resize(s.size() + num * 5);
int newidx = s.size() - 1;
int old = s.size() - 1 - num*5;//old的长度重新计算
while(old >= 0)
{
if(s[old] >= '0' && s[old] <= '9')
{
s[newidx--] = 'r';
s[newidx--] = 'e';
s[newidx--] = 'b';
s[newidx--] = 'm';
s[newidx--] = 'u';
s[newidx--] = 'n';
}
else
{
s[newidx--] = s[old];
}
old--;
}
cout << s;
return 0;
}