题目
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy
思路
1. 从头到尾遍历字符串做替换,时间复杂度为O(n2),效率低
2.从尾到头遍历字符串做替换,时间复杂度为O(n),效率高
实现
1.边界检查,判断字符数组是否为空(替换前)
2.遍历字符串,统计空格总数num_blank,统计替换前字符个数len,统计替换后字符个数new_len,其中new_len= len+ 2*num_blank
3.边界检查,判断字符数组是否越界(替换后)
4.替换空格,用指针P1指向原始字符串的末尾,指针P2指向替换后字符串的末尾。
向前移动指针P1,如果P1指向的元素不是空格,则将P1指向的元素复制给P2指向的位置;
如果P1指向的元素是空格,则P2依次向前移动并插入%20。当P1==P2时,结束替换。
#include <iostream> #include <cstring> using namespace std; class Soultation { public: void replace_blank(char *s,int length); void print(char *s); }; void Soultation::replace_blank(char *s,int length) { if(s==NULL|length<=0) return; int len=strlen(s);//替换之前字符串的实际长度 int num_blank=0; for(int i=0;i<len;++i)//统计空格数 if(s[i]==' ') ++num_blank; int new_len=len+2*num_blank;//替换之后字符串的新的长度 if(new_len+1>length)//检查替换后是否越界 return; while(len>=0&&new_len>len) { if(s[len]==' ')//在替换完成空格之后len需要向前移动一个单位,需用len--,比较新的字符 { s[new_len--]='0'; s[new_len--]='2'; s[new_len--]='%'; } else s[new_len--]=s[len];//不可len-- --len;//在完成复制或空格替换之后都需要向前移动一个单位 } } void Soultation::print(char *s) { cout<<s<<endl; } int main() { char str[60]="hello word,i'm ok"; Soultation s; s.replace_blank(str,60); s.print(str); return 0; }