这道题类似和剑指offer一书中面试题4:替换空格思路是一样的。
题目要求时间复杂度为O(N),而我们一般从前向后的思路时间复杂度为O(n^2),所以我们把思路倒过来,采用从后向前的替换方式即可达到要求的时间复杂度为O(n)。
代码如下:
void ReplacBlank(char string[], int lengh)
{
if (string == NULL&&lengh <= 0)
return;
int len = 0;
int numberblank = 0;
int i = 0;
//统计字符串的空格数量和字符串原本的数量
while (string[i]!='\0')
{
++len;
if (string[i] == ' ')
++numberblank;
++i;
}
int newlength = len + numberblank * 2;
if (newlength > lengh)
return;
int indexlen = len;
int indexnewlen = newlength;
while (indexlen >= 0 && indexlen < indexnewlen)
{
if (string[indexlen] == ' ')
{
string[indexnewlen--] = '&';
string[indexnewlen--] = '&';
string[indexnewlen--] = '&';
}
else
{
string[indexnewlen--] = string[indexlen];
}
--indexlen;
}
}
测试:
int main()
{
char arr[112] = { "hello ni hao ma." };
cout << arr << endl;
ReplacBlank(arr, 112);
cout << arr << endl;
return 0;
}
输出结果: