请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
测试样例:"A%sC%sE",7,['B','D','F']
返回:"ABCDEF"
方法:特殊函数替换法
解析:定义pos在原字符串A中查找“%s”子串,从而获得“%s”的初始位置。然后替换“%s”,即定义一个下标i,并初始化为0,再定义一个字符串接收arg中替换的字符,然后遍历原字符串A,当其元素为“%s”时,将arg中元素赋值给字符串s,再利用replace函数将原字符串中的“%s”替换成s中的元素。最后判断参数列表的字符数是否大于占位符个数,如果是则将剩下的参数字符添加到字符串的末尾。由此得到替换后的字符串。
代码:
//string::npos参数:pos 是一个常数,用来表示不存在的位置,类型一般是std::container_type::size_type 许多容器都提供这个东西。取值由实现决定,一般是-1,这样做,就不会存在移植的问题了。
//find函数的返回值是整数,假如字符串存在包含关系,其返回值必定不等于npos,但如果字符串不存在包含关系,那么返回值就一定是npos。所以不难想到用if判断语句来实现!
string formatString(string A, int n, vector<char> arg, int m)
{
int pos = A.find("%s");//在A中查找“%s"串
int i = 0;
string s;
while(pos != string::npos)
{
s = arg[i++];
A.replace(pos,2,s,0,1);//替换
pos = A.find("%s");
}
while(i < m)
{
A += arg[i++];
}
return A;
}
方法二:特殊函数删除法
解析:先定义一个变量k,初始化为0,表示arg替换时的下标,然后遍历原字符串A,替换“%s”,即判断元素是否为‘%’并且下个元素为‘s’,如果是,arg中的某个元素替换当前元素,再用erase函数删除后一个元素;最后判断变量k是否不等于arg的长度,如果是,则将剩下的字符使用循环语句将其放入在字符串A中;如此可以得到替换后的字符串。
代码:
//erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
//erase(position);删除position处的一个字符(position是个string类型的迭代器)
//erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
string formatString(string A, int n, vector<char> arg, int m)
{
int k=0;
for(int i=0;i<n;i++)
{
if(A[i]=='%'&&A[i+1]=='s')
{
A[i]=arg[k];
k++;
A=A.erase(i+1,1);
}
}
if(k!=m)
{
for(int j=k;j<m;j++)
A=A+arg[j];
}
return A;
}
方法三:特殊函数复制法
解析:先遍历原字符串A,将其‘%s’替换,即定义一个变量找到‘%’的位置,然后用substr复制函数将‘%’位置前的字符复制到新的字符res中,再将‘%s’替换的arg中的元素写入新地字符串res中,此时用substr函数将A的字符串变为‘%s’之后的部分,如此反复替换完‘%s’;接着将新的字符串res与A相加得到字符串res;最后用遍历的方式将arg中剩余的元素写入res末尾,由此得到最终所求解的字符串。
代码:
string formatString(string A, int n, vector<char> arg, int m)
{
string res;
int count = 0;
while(A.find('%') != -1)
{
int index = A.find('%');
string a = A.substr(0,index);
res = res + a;
res = res + arg[count++];
A = A.substr(index+2,A.size());
}
res = res + A;
for(int i = count; i < m; i++)
{
res = res + arg[i];
}
return res;
}