字符串替换

请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值