把字符串中的空格替换为"%20"

题目描述:

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

输入:

每个输入文件仅包含一组测试样例。
对于每组测试案例,输入一行代表要处理的字符串。

输出:

对应每个测试案例,出经过处理后的字符串。

样例输入:

We Are Happy

样例输出:

We%20Are%20Happy

问题求解:

方法一:如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简单。遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。

#include 

using namespace std;

string ReplaceBlank(string s)
{
    int n=s.size();
    string res="";
    for(int i=0;iif(s[i]==' ')
        {
            res += "%20";
        }
        else
        {
            res.push_back(s[i]);
        }
    }
    return res;
}

int main()
{
    //string s="We Are Happy";
    string s;
    getline(cin, s);
    string res = ReplaceBlank(s);
    cout<return 0;
}

方法二:如果要求在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。

如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。!!!

(1)首先遍历原字符串,找出其中的空格数量
(2)根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
(3)设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
(4)如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指
向为空格,那么从point2开始赋值“02%”
(5)直到point1==point2时表明字符串中的所有空格都已经替换完毕。
#include 
#include
#include

using namespace std;

char str[10000001];
void blankReplace(char str[], int len)
{
    int count = 0;
    //统计空格的个数
    for(int i = 0;i < len;i++){
        if(str[i] == ' '){
            count++;
        }
    }
    //原始字符串末尾
    int i = len;
    //替换之后字符串末尾
    int j = 2*count+len;
    //i == j 表示空格替换完毕
    while(i != j && i >= 0){
        if(str[i] == ' '){
            str[j--] = '0';
            str[j--] = '2';
            str[j--] = '%';
            i--;
        }
        else{
            str[j--] = str[i--];
        }
    }
}
int main()
{
    gets(str);
    int len = strlen(str);
    blankReplace(str, len);
    //输出替换之后的字符串
    puts(str);
    return 0;
}

扩展:如果要清除空格,则更加容易。清除空格后所得到的字符串要比原先的字符串要短,从头到尾进行清除空格的话就不会覆盖到空格后面的字符,可以从头开始清除。具体操作:

设定两个指针p1和p2初始状态都指向字符串首字符。如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素。直到p2指向字符串末尾的’\0’时清除空格结束。

你可能感兴趣的:(leetcode)