链接剑指 Offer 05. 替换空格 - 力扣(Leetcode)
题目
思路
- 一开始想到的是从头开始遍历,记录空格的个数,申请新数组和两个指针,一个指针i指向原字符串第一个元素,第二个指针j指向新字符串第一个元素,当i指向的元素不为空时传入新数组内,当i指向的元素为空时指针j输出‘%20’并往后遍历两个位置,最后输出新数组
- 看了代码随想录的思路,发现也是用双指针法,不同的是,没有申请新数组(只是扩展了原数组的长度?),从后向前替换空格:申请了两个指针,指针i指向原字符串的最后一个元素,指针j指向新字符串的最后一个位置,同时向前遍历(好处:有效避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题)
需要注意的是申请新的数组时 长度应为n+1
int anslen=slen+2*count;
char* ans=(char*)malloc(sizeof(char)*anslen+1);
申请的内存空间为n+1个,使ans[0]位置不存放数据
最终代码
char* replaceSpace(char* s){
int slen=strlen(s);
int count=0;
for(int i=0;i<slen;i++)
{
if(s[i]==' ')count++;
}
int anslen=slen+2*count;
char* ans=(char*)malloc(sizeof(char)*anslen+1);
for(int j=anslen-1,m=slen-1;m>=0;j--,m--)
{
if(s[m]!=' ')ans[j]=s[m];
else{
ans[j]='0';
ans[j-1]='2';
ans[j-2]='%';
j=j-2;
}
}
ans[anslen]='\0';
return ans;
}
时间复杂度O(n) 若不从最后开始往前遍历 则时间复杂度为O(n^2)