题目描述
实现一个函数,把字符串中的每个空格替换成“20%”,例如:we are happy,则输出“we20%are20%happy”。
解题思路
时间复杂度为O(n2)的解题思路
当我们看到这道题的第一个思路可能是从头开始遍历字符串数组,当遇到空格的时候就将空格替换成20%,这种解法,每次插入的时候得将空格后的字符向后偏移,时间复杂度为O(n),那么能不能减少移动次数呢,来优化时间复杂度。
时间复杂度为O(n)的解题思路
我们可以一次性遍历字符串,将字符串的长度以及空格的总数量统计出来,然后计算出来替换后的字符串的总的长度,每次遇到空格后将空格替换为20%,因此替换后的字符串的总长度应为空格长度乘2加上原来的长度,从字符串的后面开始复制和替换,如下图:
我们定义两个指针p1,p2,p1指向原字符串的末尾,p2指向替换后字符串的末尾,p1和p2一起向前移动,当p1位置不为空格时,就直接复制继续向前走,如果p1指向的位置为空格时,就在p2位置向前插入20%当p1 = p2时,,插入替换完成。
代码实现
#include <stdio.h>
#include <string.h>
void ReplaceOfBlank(char string[],int length)
{
if(string == NULL || length <= 0)
{
return;
}
int origionalLength = 0;
int numberOfBlank = 0;
int i = 0;
while(string[i] != '\0')
{
origionalLength += 1;
if(string[i] == ' ')
{
numberOfBlank += 1;
}
i++;
}//统计出原字符串的长度和空格个数
int newLength = origionalLength + 2 * numberOfBlank;//计算出新的字符串的长度
if(newLength > length)
{
return;
}
int indexOforiginal = origionalLength;
int indexOfNew = newLength;
while(indexOforiginal >= 0 && indexOfNew > indexOforiginal)
{
if(string[indexOforiginal] == ' ')
{
string[indexOfNew--] = '0';
string[indexOfNew--] = '2';
string[indexOfNew--] = '%';
}
else
{
string[indexOfNew--] = string[indexOforiginal];
}
indexOforiginal--;
}//进行字符替换
}
对解法进行优化后,时间复杂度就变成O(n),降低了时间复杂度