3.替换数字

思路:

首先扩充数组到每个数字字符替换成 "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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值