面试题5:替换空格
题目:
请实现一个函数,把字符串中的每一个空格替换成为”%20“
。例如,输入”We are happy.“
,则输出”We%20are%20happy.“
思绪:
计算空格的个数,然后重新去分配一个替换后大小的数组,然后去遍历一遍整个数组实现整个过程,时间复杂度为O(n)
;
题解:
也同样是计算空格数,但是他是在原来数组的基础上重新分配数组大小,然后再设定两个指针P1
,P2
。P1
指向原来数组的尾部,P2
指向替换之后的字符串的末尾。然后重后往前遍历,逐个把它指向的字符复制到P2
的位置,直到遇到空格为止,遇到空格着移动P2
把要填充字符串填入,再按照上面的要求完成整个数组的填充,时间复杂度为O(n)
,相比自己的想法他的空间复杂度降低,我是重新分配的数组,他是在原数组上进行改写。
代码:
void ReplaceBlank(string& arr) {
if (arr.empty()) {
return;
}
/*originalLength为字符串string的实际长度,numberOfBlank空格长度*/
int originalLength = arr.size();
int numberOfBlank = 0;
for (char item : arr) {
if (item == ' ') {
numberOfBlank++;
}
}
/*重新规划大小*/
int newsize = originalLength + numberOfBlank * 2;
arr.resize(newsize);
int indexOfOriginal = originalLength - 1;
int indexOfNew = newsize - 1;
while (indexOfOriginal >= 0 && indexOfOriginal < indexOfNew) {
if (arr[indexOfOriginal] == ' ') {
arr[indexOfNew--] = '0';
arr[indexOfNew--] = '2';
arr[indexOfNew--] = '%';
} else {
arr[indexOfNew--] = arr[indexOfOriginal];
}
indexOfOriginal--;
}
注:
在合并两个数组(或字符串)的时候,若果从前往后复制两个数字(或字符串)则需要重复移动数字多次,那么我们可以考虑从后往前复制这样就可以减少移动的次数,从而提高效率