Write a method to replace all spaces in a string with ‘%20’.
思路:耗费空间的解法是,再定义一个数组,将原数组复制到新数组中,复制的过程中进行替换,空间复杂度O(n); 优化:直接在原数组中操作,不过要从后往前,不然会造成覆盖。这让我想到了memcpy实现的过程中也可能出现覆盖需要从后往前覆盖的情况。
时间复杂度:O(n) 空间复杂度:O(num_spaces)
void replaceSpaces(char* str){ if(str==NULL) return; int num_spaces=0,len=0; for(len=0;*(str+len)!='\0';len++) if(*(str+len)==' ') num_spaces++; int new_len=len+num_spaces*2; str[new_len+1]='\0'; for(;len>=0;len--){ if(*(str+len)==' '){ str[new_len--]='0'; str[new_len--]='2'; str[new_len--]='%'; }else{ str[new_len--]=str[len]; } } }
刚才对照了一下答案发现自己的写法是错误的,尽管结果都正确。因为数组的下标是从0开始的,所以new_len其实已经表示到了'\0'的位置,不需要加1. 粗心还是通病啊,克服,克服
void replaceSpaces(char* str){ if(str==NULL) return; int num_spaces=0,len=0; for(len=0;*(str+len)!='\0';len++) if(*(str+len)==' ') num_spaces++; int new_len=len+num_spaces*2; str[new_len]='\0'; new_len--; for(len=len-1;len>=0;len--){ if(*(str+len)==' '){ str[new_len--]='0'; str[new_len--]='2'; str[new_len--]='%'; }else{ str[new_len--]=str[len]; } } }