思路:
首先扩充数组到每个数字字符替换成 "number" 之后的大小。
然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。
从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。
其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
储备:
主要用到了扩容resize的操作
C++之 string(中)_c++ string resize-CSDN博客
问题重点:
1、
原地扩容,从后往前填充
2、
注意(idx1立马减小)
while(idx1--)
和(一开始为0的话可能数组越界)
while(idx1){
idx--;
}
和(正确写法)
while(idx1>=0){
idx--;
}
是有差异的。
最后:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int cnt=0;
for (int i=0;i<s.size();i++) {
if (s[i]>='0' && s[i]<='9') cnt++;
}
int idx1=s.size()-1;//旧长度的序号
//扩容。
s.resize(s.size()+cnt*5);//每个数字翻6倍的长度,就是每个数字加5个长度
int idx2=s.size()-1;//新长度的序号
//新旧长度一起开始移动
while (idx1>=0) {//从后向前填充,避免数组的移动
//遇到数字的话
if (s[idx1]>='0' && s[idx1]<='9') {
s[idx2--]='r';
s[idx2--]='e';
s[idx2--]='b';
s[idx2--]='m';
s[idx2--]='u';
s[idx2--]='n';
} else {//遇到字母的话照常复制
s[idx2--]=s[idx1];
}
idx1--;
}
cout<<s<<endl;
return 0;
}
1667

被折叠的 条评论
为什么被折叠?



