您的位置:首页 > 其它

字符串的空格替换算法

2016-11-28 19:02 323 查看
1.问题:实现一个函数,把字符串中的每个空格替换成"%20".例如 输入"We are happy.",则输出"We%20are%20happy."(特别在网络编程中这样的问题很常见)

书中采用从后往前把字符串替换成"%20",时间复杂度为O(n)的时间算法:

// ReplaceBlank.cpp : Defines the entry point for the console application.

// 《剑指Offer——名企面试官精讲典型编程题》代码

// 著作权所有者:何海涛

#include "stdafx.h"

#include <string>

 /*替换函数  length 为字符数组string的总容量*/

void ReplaceBlank(char string[], int length)

{

    if(string == NULL && length <= 0)

        return;

    /*originalLength 为字符串string的实际长度*/

    int originalLength = 0;

    int numberOfBlank = 0;

    int i = 0;

    while(string[i] != '\0')

    {

        ++ originalLength;

        if(string[i] == ' ')

            ++ numberOfBlank;

        ++ i;

    }

    /*newLength 为把空格替换成'%20'之后的长度*/

    int newLength = originalLength + numberOfBlank * 2;

    if(newLength > length)

        return;

    int indexOfOriginal = originalLength;

    int indexOfNew = newLength;

    while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)

    {

        if(string[indexOfOriginal] == ' ')

        {

     //将空格替换成%20 (ASCII码)

            string[indexOfNew --] = '0';

            string[indexOfNew --] = '2';

            string[indexOfNew --] = '%';

        }

        else

        {

            string[indexOfNew --] = string[indexOfOriginal];

        }

        -- indexOfOriginal;

    }

}

 //测试函数统一入口,与希望测试的结果进行对比

void Test(char* testName, char string[], int length, char expected[])

{

    if(testName != NULL)

        printf("%s begins: ", testName);

    ReplaceBlank(string, length);

    if(expected == NULL && string == NULL)

        printf("passed.\n");

    else if(expected == NULL && string != NULL)

        printf("failed.\n");

    else if(strcmp(string, expected) == 0)

        printf("passed.\n");

    else

        printf("failed.\n");

}

// 空格在句子中间

void Test1()

{

    const int length = 100;

    char string[length] = "hello world";

    Test("Test1:空格在句子中间", string, length, "hello%20world");

}

// 空格在句子开头

void Test2()

{

    const int length = 100;

    char string[length] = " helloworld";

    Test("Test2 空格在句子开头", string, length, "%20helloworld");

}

// 空格在句子末尾

void Test3()

{

    const int length = 100;

    char string[length] = "helloworld ";

    Test("Test3空格在句子末尾", string, length, "helloworld%20");

}

// 连续有两个空格

void Test4()

{

    const int length = 100;

    char string[length] = "hello  world";

    Test("Test4连续有两个空格", string, length, "hello%20%20world");

}

// 传入NULL

void Test5()

{

    Test("Test5传入NULL", NULL, 0, NULL);

}

// 传入内容为空的字符串

void Test6()

{

    const int length = 100;

    char string[length] = "";

    Test("Test6传入内容为空的字符串", string, length, "");

}

//传入内容为一个空格的字符串

void Test7()

{

    const int length = 100;

    char string[length] = " ";

    Test("Test7传入内容为一个空格的字符串", string, length, "%20");

}

// 传入的字符串没有空格

void Test8()

{

    const int length = 100;

    char string[length] = "helloworld";

    Test("Test8传入的字符串没有空格", string, length, "helloworld");

}

// 传入的字符串全是空格

void Test9()

{

    const int length = 100;

    char string[length] = "   ";

    Test("Test9传入的字符串全是空格", string, length, "%20%20%20");

}

int _tmain(int argc, _TCHAR* argv[])

{

    Test1(); //空格在句子中间

    Test2(); //空格在句子开头

    Test3(); //空格在句子末尾

    Test4(); //连续有两个空格

    Test5(); //传入NULL

    Test6(); //传入内容为空的字符串

    Test7(); //传入内容为一个空格的字符串

    Test8(); // 传入的字符串没有空格

    Test9(); //传入的字符串全是空格

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  替换空格