题目描述:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为we are happy.则经过替换之后的字符串为we%20are%20happy。
解题思路有:
#判断字符串是否为空,判断length是否大于0。
#记录空格的数量,没有空格直接返回原字符串。
1)考虑的问题:替换字符串是在原字符串上修改(a)还是新建字符串修改(b)
2)在当前字符串替换,怎么替换才更有效率
:
2-1 从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下(在原字符串改动时)
2-2 从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
测试用例:
1)输入中包含空格(空格位于最前方,最后方,中间,有连续多个空格)
“hello world”
2)输入中没有空格
3)特殊输入测试(字符串是nullptr指针;字符串是空字符串)
代码:
a 新建字符串+从前往后复制 运行时间:3ms 占用内存:400-600k
1 class solution { 2 public: 3 void replacespace(char *str,int length) { 4 //判断特殊的情况 5 if(str==null||length<=0) 6 return; 7 int totallength=0; 8 vector<int> index ; 9 10 for (int i=0;str[i]!=' ';i++){ 11 totallength++; 12 //if(isspace(str[i])) 13 if(str[i]==' ') 14 index.push_back(i); 15 } 16 17 if (index.empty()) //判断是否有空格 18 return; 19 else{ 20 int spacenum = index.size(); 21 char* newstr = new char [totallength+spacenum*2+1]; //用不用加1? 22 23 for(int i=0,k=0;i<=totallength;i++) // 判断的时候有等于(<=)' '也要拷贝 24 { 25 if(i==index[k]){ 26 *newstr++='%'; 27 *newstr++='2'; 28 *newstr++='0'; 29 str++; 30 k++; 31 } 32 else 33 *newstr++=*str++; 34 } 35 newstr=newstr-(totallength+spacenum*2)-1; 36 str=str-totallength-1; 37 for(int j=0;j<=(totallength+spacenum*2);j++){ 38 str[j]=newstr[j]; 39 } 40 } 41 } 42 };
new array + front to back
注意:
1」主体代码line23-34执行结束后,newstr指针内存储修改后的代码。但该段代码执行后指针指向’