要求时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1),则说明只能遍历一次需要移动的元素只移动一次,且不能再分配和字符串同样级别的空间。
这里一共设置了两个指针,一个指针用来迭代字符串中的每一个字符,另一个指针用来指向当前需要搬运的字符的插入位置。如果没有遇到空格则这两个指针的迭代是同步的,但是如果遇到空格,用于迭代的指针会继续迭代直到找到下一个不为空格的字符。而另一个用来指向当前需要搬运的字符的插入位置的指针继续保持在原位。将此时用于迭代的指针指向的字符搬运到用来指向当前需要搬运的字符的插入位置的指针指向的位置。如此的迭代保证了经过一次遍历和搬运之后就可以删除字符串中所有的空格。这里有一点需要注意的是不管有没有出现空格,都会出现赋值操作(也就是即使两个指针是同步的时候也会赋值,这样是为了某些特殊的情况,比如字符串中只有一个空格,如图2所示)。
代码参考于这位兄台的。一个具体的例子如图1所示。
int deleteSpace(char* pStr)
{
assert(pStr);
char *pOfCurrentInsert = pStr; //由于空格的原因,如果有字符需要向前搬运,该指针指向当前的字符搬运目的地
char * pOfIteration = pStr; //指向当前正在迭代的字符串中的字符
int countOfSpace = 0;
while (*pOfIteration != '\0')
{
while (*pOfIteration == ' ')
{
countOfSpace++;
pOfIteration++;
}
*pOfCurrentInsert = *pOfIteration;//也就是即使两个指针是同步的时候也会赋值
if (*pOfCurrentInsert == '\0')
{
return countOfSpace;
}
else
{
pOfCurrentInsert++;
}
pOfIteration++;
}
*pOfCurrentInsert = '\0';
return countOfSpace;
}