题目:-替换字符串中的空格为$$$。要求时间复杂度为O(N)
方法
我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后的字符串的长度等于原来的长度加上2乘以空格数目。
我们从字符串的后面开始复制和替换。首先准备两个指针,P1和P2.
P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。接下来我们向前移动指针,直到碰到第一个空格为止。碰到第一个空格之后,把P1向前移动一格,在P2之前插入字符串。由于$$$字符串的长度为3,同时也要把P2向前移动3格。
我们接着向前复制,直到碰到第二个空格,和上一次一样,我们再把P1向前移动一个,并把P2向前移动三格插入所需替换的符号,依次循环,最终P1和P2指向同一位置。
void replaceSpace(char string[], int length)
{
if (string == NULL || length <= 0)
return;
int originallength = 0;
int numberofblank = 0;
int i = 0;
while (string[i] != NULL)
{
++originallength;
if (string[i] == ' ')
numberofblank++;
++i;
}
int newlength = originallength + numberofblank * 2;
/*if (newlength > length)
return;*/
int indexoforiginal = originallength;
int indexofnew = newlength;
while (indexoforiginal >= 0 && indexofnew > indexoforiginal)
{
if (string[indexoforiginal] == ' ')
{
string[indexofnew--] = '$';
string[indexofnew--] = '$';
string[indexofnew--] = '$';
}
else
{
string[indexofnew--] = string[indexoforiginal];
}
--indexoforiginal;
}
}
void TestreplaceSpace()
{
char str[] = "talk is cheap show me the code";
int size = strlen(str)+1;
replaceSpace(str, size);
}