1. 程式人生 > >劍指Offer面試題4 替換空格

劍指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;
}