一.题目
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy!”,则输出“We%20are%20happy!”
二.思路
这里替换空格还会造成字符串长度的延长,这是本题的关键。如果是在原来的字符串上做修改,就有可能覆盖修改在该字符后面的内存,如果是创建新的字符串并在新的字符串上进行替换,那么我们可以分配足够多的内存。因而有两种解决方案,我们应该与面试官沟通一下。这里我们假设在原来的字符串上修改,并且保证输入的字符串后面有足够多的空余内存。
我们首先考虑从前往后扫描,每次遇到空格之后进行替换,但是这样操作的话每次替换都要移动后面的字符,总的时间效率是O(n2),效率太低;于是我们考虑从后往前扫描:
首先准备两个指针:p1和p2。p1指向原始字符串的末尾,p2指向替换之后字符串的末尾。接下来我们移动p1,如果p1指向的字符不是空格,我们把它指向的字符复制到p2指向的位置,然后p1和p2都向前移动一位;如果p1指向的字符是空格,我们为您首先把p1向前移动一位,然后在p2之前插入“%20”;直到p1指向字符串开头的位置。
三.代码
void ReplaceBlank(char string[],int length){ // string:待替换数组 // length::数组容量(数组实际长度小于等于容量) if(string == nullptr || length <= 0) return; int originalLength = 0; //数组实际长度 int numberOfBlank = 0; //数组空格个数 int i = 0; while(string[i] != '