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];
}
}
}