剑指offer 05.替换空格
剑指offer 05.替换空格
题目
题目
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
题目链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof/
题解
解法1:一次双层循环,不断后移元素
解法分析
双重循环,外循环遍历元素,如果遇到空格,进入内循环【将当前元素变为’%‘,将后面的元素往后移位,第一个移动元素和第二个移动元素分别更改为’2’和’0’,剩下元素全部后移两位】
边界条件、特殊值分析、测试、注意事项
- 字符串本身是空指针
- 字符串是空串
- 字符串只有一个空格字符
- 字符串有多个连续字符
- 字符串中没有空格
- 字符串中空格位置为前、中、后
- 新字符串结尾要有空字符
复杂度分析
时间复杂度 O(n^2)
空间复杂度 O(1) 因为空间复杂度只计算额外消耗空间
代码
//偷懒没写,这个不难应该?或许之后会补上
可能存在的问题
- 暂无
解法2:两次一层循环
解法分析
第一次循环找出空格数,根据【新字符串长度=原串长度+空格数*2+1】,最后的+1是空字符所需空间,申请新字符串长度空间,再次遍历旧字符串,使用两个下标分别指向新、旧字符串,依次遍历处理即可。
边界条件、特殊值分析、测试、注意事项
- 字符串本身是空指针
- 字符串是空串
- 字符串只有一个空格字符
- 字符串有多个连续字符
- 字符串中没有空格
- 字符串中空格位置为前、中、后
- 新字符串结尾要有空字符
复杂度分析
时间复杂度 O(n)
空间复杂度 O(n)
代码
string replaceSpace(string s) {
//遍历两次,第一次获取空格多少,第二次进行修改复制
//前提:允许使用额外o(n)的空间
int len=s.size();//原字符串长度
if(len==0)return s;
int numBlank=0;
for(int i=0;i<len;i++)
{
if(s[i]==' ')numBlank++;
}
int size=len+numBlank*2+1;//新字符串长度
string news(size,'0');
news[size-1]='\0';
for(int i=0,j=0;i<len;i++,j++)
{
if(s[i]==' ')
{
news[j]='%';
news[++j]='2';
news[++j]='0';
}
else
{
news[j]=s[i];
}
}
return news;
}
可能存在的问题
- 计算长度的式子,在Leetcode上面很多人没有加一,需不需要呢?