题目:实现一个函数,将字符串中的每个空格替换成字符串“%20”。
解题思路1
使用暴力的方法,从左到右扫描一遍,当遇到空格时就把空格替换成“%20”,然后把空格后面的字符都后移2个位置。由于需要整个字符串扫描一遍,时间为O(n),替换空格时移动字符的时间复杂度为O(n),因此总的时间复杂度为O(n^2)。
解题思路2
因为每个空格会替换成一个三个字符的字符串,因此替换后的新字符串的长度是可知的。从前往后替换最耗时的操作是后移字符,那么就可以转换思维,从后往前替换,每次替换就不需要移动其他字符,时间复杂度为O(1)。因此需要的操作是
- 扫描一遍字符串,统计空格个数算出新字符串长度从而得到新字符串末尾的位置,时间为O(n)
- 从后往左扫描字符串,将空格替换成字符串“%20”
因此,总的时间复杂度为O(n)。这种从前往后难,从后往前易的思维可以迁移到其他类似问题中:
- 将有序数组B合并到有序数组A中,因为数字总数已知,就可以从右往左插入。
- 大数乘法,结果的位数不会超过两个数位数之和,因此可以新建一个长度为两数位数之和的字符串作为结果,在结果字符串上进行操作。
void replaceSpace(char *str,int length) {
if (str==nullptr || length<=0)
return;
int p = length;
for (int i=0;i<length;i++)
if (str[i]==' ')
p += 2;
str[p--] = '\0';
for (int i=length-1;i>=0;i--){
if (str[i]==' '){
str[p--] = '0';
str[p--] = '2';
str[p--] = '%';
}
else
str[p--] = str[i];
}
}