剑指Offer面试题4 替换空格

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

解题思路1:在原有的字符串上进行替换,将原来的一个空格替换成"%"、"2"、"0"这3个字符(字符串会因此变长,我们要保证原有的字符串后面有足够多的空余内存)。做法是扫描字符串每一次遇到空格时做替换,将一个字符替换成3个字符,然后将空格后面的所有字符都向后移2个字符。不足:若有多个空格就会发现有很多字符都移动了多次。

解题思路2:创建一个新的字符串,然后在新的字符串上做替换。首先遍历字符串求出串中空格的数量,求出替换之后字符串的总长度(每替换一个空格,长度加2)。做法是从字符串的后面向前复制和替换。有2个指针p1、p2,p1指向原字符串的尾,p2指向替换之后的字符串的尾。接下来向前移动指针p1,逐个的将p1指向的字符复制到p2指向的位置,碰到空格时,p1向前移动一格,在p2之前插入字符串"%20",再将p2向前移动3个。当p1和p2指向同一位置时,表明所有空格都已经替换完成。优点:所有的字符只复制或是移动一次,比方法1要快。

#include <iostream>
using namespace std;

void ReplaceBlank(char string[],int length)
{
    if(string == NULL || length <= 0) return ;

    int originalLength = 0;
    int numberOfBlank = 0;
    int i=0;
    while(string[i] != '\0')
    {
        ++originalLength;
        if(string[i] == ' ')
            ++numberOfBlank;
        ++i;
    }
    int newLength = originalLength + 2*numberOfBlank;
    if(newLength > length)
        return ;

    int indexOfOriginal = originalLength;
    int indexOfNew = newLength;

    while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
    {
        if(string[indexOfOriginal] == ' ')
        {
            string[indexOfNew--] = '0';
            string[indexOfNew--] = '2';
            string[indexOfNew--] = '%';
        }
        else
            string[indexOfNew--] = string[indexOfOriginal];
        --indexOfOriginal;
    }

}

int main()
{
    char str[] = "We are happy.";

    ReplaceBlank(str,100);
    cout << str << endl;


    return 0;
}











猜你喜欢

转载自blog.csdn.net/qq_40186833/article/details/83892590