思路:
(1)第一次遍历原字符串统计空格个数,以计算替换空格后字符串所占空间大小,并分配内存。
(2)第二次遍历原字符串,对新字符串进行赋值。对于非空格字符,直接拷贝;对空格进行相应替换。记得在末尾加上字符串结束标志。
char* replaceSpace(char* s){
// 统计空格个数
int countSpace = 0;
for(int i=0; i<strlen(s); i++)
{
if(s[i] == ' ') countSpace++;
}
// 计算替换空格后字符串所占空间,然后申请内存
int totalSize = strlen(s) + countSpace*2 + 1;
char *str = malloc(sizeof(char)*totalSize);
// 拷贝并替换空格
int index = 0;
for(int i=0; i<strlen(s); i++)
{
if(s[i] == ' ')
{
str[index++] = '%';
str[index++] = '2';
str[index++] = '0';
}
else str[index++] = s[i];
}
str[index] = '\0';
// 释放原字符串空间,避免内存泄漏
free(s);
return str;
}
时间复杂度
O
(
n
)
O(n)
O(n):两次遍历
空间复杂度:
官方说是
O
(
n
)
O(n)
O(n),可是这相当于动态扩容,不算额外空间吧?