1.题目
# 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2.思路
# 从头到尾遍历字符串做替换,时间复杂度为O(n2),效率低
# 从尾到头遍历字符串做替换,时间复杂度为O(n),效率高
3.举例(从尾到头遍历字符串)
# 边界检查,判断字符数组是否为空
# 遍历字符串,统计空格总数count_space,统计替换前字符个数count_old,统计替换后字符个数count_new,其中count_new = count_old + 2*count_space
# 边界检查,判断字符数组是否越界
# 替换空格,用指针P1指向原始字符串的末尾,指针P2指向替换后字符串的末尾。向前移动指针P1,如果P1指向的元素不是空格,则将P1指向的元素复制给P2指向的位置;如果P1指向的元素是空格,则P2依次向前移动并插入%20。当P1==P2时,结束替换。
4.code
# C++字符数组存储字符串,字符数组中编译器自动添加字符串的结束标识’\0’,字符串结束标识在字符数组中占一个位置,注意字符数组的越界问题。
1 class Solution { 2 public: 3 // 指向字符数组的字符指针str,字符数组长度length 4 void replaceSpace(char *str,int length) { 5 6 // 边界检查1:判断字符数组是否为空 7 if(str==NULL) 8 return ; 9 // 遍历字符串,统计空格个数、替换前字符个数、替换后字符个数 10 int CountOfBlanks=0; // 空格个数 11 int Originallength=0;// 替换前字符个数 12 int len=0; // 替换后字符个数 13 14 for(int i=0;str[i]!='\0';++i) 15 { 16 Originallength++; 17 if(str[i]==' ') 18 ++CountOfBlanks; 19 } 20 21 len =Originallength+2*CountOfBlanks; 22 23 // 边界检查2:判断字符数组是否越界 24 if(len+1>length) 25 return ; 26 27 // 替换空格 28 char*pStr1=str+Originallength;// 字符指针指向原始字符串的末尾 29 char*pStr2=str+len; // 字符指针指向替换后字符串的末尾 30 31 while(pStr1 != pStr2) // 替换结束的条件 32 { 33 if(*pStr1==' ') 34 { 35 *pStr2--='0'; 36 *pStr2--='2'; 37 *pStr2--='%'; 38 } 39 else 40 { 41 *pStr2--=*pStr1; 42 } 43 --pStr1; 44 } 45 } 46 };