题目
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为"anumberbnumbercnumber"。
“a1b2c3”---->“anumberbnumbercnumber”
思路
①获取字符串
②获取字符串中数字个数
③定义一个新的字符串,长度由原字符串与第二步所得到的数字个数有关
(处理方法二:改变原字符串长度,在元字符串上原地操作,本题采用方 法二)
④根据要求替换数字
⑤输出结果
代码
#include<iostream>
using namespace std;
int main()
{
string s;
int count=0;
cin>>s;
int size=s.size();
for(int i=0;i<size;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
count++;
}
}
//std::cout << count << std::endl;
s.resize(s.size()+count*5);
//cout << s.size() << endl;
int newSize=s.size();
char number[]={'r','e','b','m','u','n'};
for(int i=size-1;i>=0;i--)
{
//cout<< s[i] <<endl;
newSize--;
if(s[i]>='0'&&s[i]<='9')
{
for(int t=0;t<6;t++)
{
s[newSize-t]=number[t];
}
newSize=newSize-5;
}
else
{
s[newSize]=s[i];
}
}
cout<< s <<endl;
return 0;
}
代码整体描述
因为需要写整体的代码,包括头文件主函数等,而不是只写一个方法接口,所以一些细节需要遵守判题机制,这些在代码详解里就不过多赘述,如:引入头文件,主函数返回值等。
代码详解
string s;
int count=0;
cin>>s;
int size=s.size();
定义字符串s用于接收输入;count用于统计s中数字个数;cin>>s接收输入
size存放原始输入s的字符串大小。
for(int i=0;i<size;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
count++;
}
}
统计数字个数。
s.resize(s.size()+count*5);
int newSize=s.size();
char number[]={'r','e','b','m','u','n'};
resize函数可以改变原来字符串的长度,后面的表达式为原来长度加上需要扩长的长度,需要注意的是count是乘以5而不是乘以替换字符串的长度6,这是因为在原来的字符串中已经占用了一个数字,每次替换只增长5个字符。
newSize变量用于存储变长后的字符串长度。
number变量存放需要替换的字符串,眼尖的码友应该发现了 我这里number存放的不是“number”字符串 而是“number”的反转,这是因为我们采用尾更新的方式进行修改原字符串,反转一下方便取值,码友们也可以顺序存放,只不过取值的时候注意一下就行。
for(int i=size-1;i>=0;i--)
{
//cout<< s[i] <<endl;
newSize--;
if(s[i]>='0'&&s[i]<='9')
{
for(int t=0;t<6;t++)
{
s[newSize-t]=number[t];
}
newSize=newSize-5;
}
else
{
s[newSize]=s[i];
}
}
cout<< s <<endl;
这里就是尾插法的实现过程,说明一下如果采用前插,原始数据会被覆盖,导致代码bug。
实现过程:我们保存了原始数据的字符串长度size,从这入手,如果不是数组就插入到新字符串规模下的队尾,如果是数字,就逐一插入number数组里的值,因为我们事先反转了number,所以顺着取就行,插入的同时记得改变指向插入位置的变量就行(我这里没有定义新的变量来指向插入的位置,直接用newSize变量来用,因为后面也用不到,而且字符串长度也可以获取)。
最后输出