剑指offer面试题4

来源:互联网 发布:美国eia数据是什么 编辑:程序博客网 时间:2024/05/18 00:27

面试题4: 替换空格

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

思路:首先根据先验知识,对字符串空间进行调整,然后把字符串从后先前替换

代码:

#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] == ' ') //遇到空格向前移到3个字节        {            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");}// 传入NULLvoid Test5(){    Test("Test5", 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();    Test6();    Test7();    Test8();    Test9();    return 0;}

/*********************************7月14日*******************/

// 面试题4.cpp : 定义控制台应用程序的入口点。////面试题4: 替换空格#include "stdafx.h"#include <string.h>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;     //字符串的长度,不包括'\0'字符if(string[i] == ' ')++ numberOfBlank; //字符串中空格的个数i++;}int newLength = originalLength + numberOfBlank * 2;  //新的字符串长度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; //这个索引在不停的递减}}/*************测试******************///包含空格 中间多个void Test1(){char string[100] = "We are happy";printf("len = %d\n", strlen(string));ReplaceBlank(string,100);printf("%s\n", string);}//包含空格 开始多个void Test2(){char string[100] = "     We are happy";printf("len = %d\n", strlen(string));ReplaceBlank(string,100);printf("%s\n", string);}//包含空格 结尾多个void Test3(){char string[100] = "     We are happy     ";printf("len = %d\n", strlen(string));ReplaceBlank(string,100);printf("%s\n", string);}//不包含空格 void Test4(){char string[100] = "Wearehappy";printf("len = %d\n", strlen(string));ReplaceBlank(string,100);printf("%s\n", string);}//字符串为NULL void Test5(){//char string[100] = "Wearehappy";//printf("len = %d\n", strlen(string));ReplaceBlank(NULL,100);//printf("%s\n", string);}//字符串为空字符串,""void Test6(){char string[100] = ""; //字符串是空字符串""printf("len = %d\n", strlen(string));ReplaceBlank(string,100);printf("%s\n", string);}//字符串只有一个空格字符void Test7(){char string[100] = " "; //字符串是空字符串""printf("len = %d\n", strlen(string));ReplaceBlank(string,100);printf("%s\n", string);}//字符串有连续多个空格字符void Test8(){char string[100] = "           "; //字符串是空字符串""printf("len = %d\n", strlen(string));ReplaceBlank(string,100);printf("%s\n", string);}int _tmain(int argc, _TCHAR* argv[]){Test1();Test2();Test3();Test4();Test5();Test6();Test7();Test8();return 0;}

/************************7月14日************************/

// 面试题3_1.cpp : 定义控制台应用程序的入口点。////字符串:常量字符串和字符串数组(P43)#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){char str1[] = "hello world";char str2[] = "hello world";char* str3 = "hello world";char* str4 = "hello world";if(str1 == str2)printf("str1 and str2 are same.\n");elseprintf("str1 and str2 are not same.\n");if(str3 == str4)printf("str3 and str4 are same.\n");elseprintf("str3 and str4 are not same.\n");return 0;}

/*********************相关题目**********************/

// 面试题4-2.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"//length是数组A1的总长度,length1是A1的元素实际个数,length2是A2元素实际个数void mergeArray(int* A1, int* A2, int length, int length1, int length2){if(A1 == NULL || A2 == NULL || length1 <= 0 || length2 <= 0)return;int newLen = length1 + length2-1;int p1 = length1-1;int p2 = length2-1;if(newLen > length)return;while(p1 >= 0 && p2 >= 0){if(A1[p1] > A2[p2])A1[newLen--] = A1[p1--];elseA1[newLen--] = A2[p2--];}}/****************测试*******************/void Test1(){int A1[100]={1,3,5,7,10,11,16,20,400};int A2[] = {2,4,6,10,20,45,200};mergeArray(A1,A2,sizeof(A1)/sizeof(int), 9,7);for(int i = 0; i < 16; i++)printf("%d ", A1[i]);printf("\n");}int _tmain(int argc, _TCHAR* argv[]){Test1();return 0;}


0 0
原创粉丝点击