替换字符串(以替换空格为例)

来源:互联网 发布:mac os 下载速度慢 编辑:程序博客网 时间:2024/06/14 03:52

题目:请实现一个函数,把字符串的每个空格替换成”%20”,例如,输入”We are happy.”,则输出”We %20are%20happy”.

/***测试用例格式*{一个空格, 多个空格, 没有空格}字符串{一个空格, 多个空格, 没有空格}字符串{一个空格, 多个空格, 没有空格}*注意size_type类型是无符号类型,std::string::nps的值是size_type持有的最大正值*注意不要将负数复制给无符号的类型,那样会把对应的负数转化为无符号数而导致错误的发生*/#include <string>#include <algorithm>#include <iostream>//method 1void replaceBlank_1(std::string& target_str, const std::string& orgin_str, const std::string& target = "%20"){    typedef std::string::size_type sz_type;    sz_type pos, pre_pos = std::string::npos;    //std::cout << "pre_pos1: " << pre_pos << std::endl;    sz_type i = 0;    //查找最后一个空格的位置    pos = orgin_str.find_last_of(' ', pre_pos);    //若原字符串中有空格字符串    if (pos != std::string::npos)    {        while ( pos != std::string::npos)        {        std::string sub_str = target+ orgin_str.substr(pos+1, pre_pos-pos);            std::copy(sub_str.begin(), sub_str.end(), std::inserter(target_str, target_str.begin()));        //pre_pos 的类型为无符号类型,当pos-1小于0时pre_pos值为对应负数转化的无符号整数            pre_pos = pos-1;        if (pre_pos == std::string::npos)        {           // std::cout << "pre_pos2: " << pre_pos << std::endl;            break;        }            pos = orgin_str.find_last_of(' ', pre_pos);        }        if (pre_pos != std::string::npos)            target_str.insert(target_str.begin(), orgin_str.begin(), orgin_str.begin()+pre_pos+1);    }    else    {        target_str = orgin_str;    }}//method2void replaceBlank_2(std::string& orgin_str, const std::string& target = "%20"){    typedef std::string::size_type sz_type;    sz_type pos = std::string::npos;    while ((pos = orgin_str.find_last_of(' ', pos)) != std::string::npos)    {        orgin_str.replace(pos, 1, target);    --pos;    }}//metod3 剑指offer中的方法 时间复杂度O(n)void replaceBlank_3(std::string& orgin_str, const std::string& target= "%20"){    typedef std::string::size_type sz_type;    sz_type space_numbers = 0;    sz_type length = orgin_str.size();    //统计空格的个数    for (sz_type i = 0; i < length; i++)    {        if (orgin_str[i] == ' ')        ++space_numbers;    }    orgin_str.resize(length+space_numbers*2, ' ');    sz_type p2 = orgin_str.size()-1;    sz_type p1 = length-1; //   std::cout << "p2 : " << p2 << std::endl; //   std::cout << "p1 : " << p1 << std::endl;    while (p1 != std::string::npos && p2 > p1)    {//        std::cout << "p1 : " << p1 << std::endl;        if (orgin_str[p1] == ' ')    {        for (sz_type i = target.size()-1; i != std::string::npos ; i--)            orgin_str[p2--] = target[i];    }    else    {        orgin_str[p2--] = orgin_str[p1];    }    --p1;    }}/**测试用例格式*{一个空格, 多个空格, 没有空格}字符串{一个空格, 多个空格, 没有空格}字符串{一个空格, 多个空格, 没有空格}*/int main(){   std::string orgin_str = "we are happy.";   std::cout << "orgin_str: " << orgin_str << std::endl;  // std::string target_str;   //replaceBlank_1(target_str, orgin_str);   //std::cout << "target_str: " << target_str << std::endl;   //replaceBlank_2(orgin_str);   replaceBlank_3(orgin_str);   std::cout << "target_str: " << orgin_str << std::endl;    return 0;}
阅读全文
0 0
原创粉丝点击