题目描述:请实现一个函数,把字符串中的每个空格替换成"%20"。
分析:首先,要将字符串转换成字符数组,再进行替换。不过在c#中,数组一旦初始化了,就无法再改变存储空间的大小,所以我用了两个字符数组。然后怎么替换呢?可以扫描到空格后将后面的字符后移,然后进行替换,这样时间复杂度为O(n^2)。有没有时间复杂度为O(n)的方法呢?我们可以试一下从后往前扫描会怎么样。先扫描一遍,获取空格的数量,然后分配空间,在原来加上两倍的空格的数量的空间,这就是空格替换后的空间。然后从后往前扫描,使用两个指针indexNew、indexCurrent,indexNew指向新字符数组的末尾,indexCurrent指向原来字符数组的末尾,若遇到空格则替换,不是则把字符移到indexNew的位置。
代码如下:
private static string ReplaceSpace(string str)
{
if (str == null || str=="")
return "-1";
string result = null;
char[] charStr = str.ToArray(); //输入的字符串转换成的数组
int originalLen = charStr.Length;
int newLen = originalLen;
//获取空格的数量
for (int i=0;i<originalLen;i++)
{
if (charStr[i] == ' ')
newLen += 2;
}
char[] newChar = new char[newLen]; //新字符串数组
for(int i=originalLen-1;i>=0;)
{
if(charStr[i]!=' ')
{
newChar[newLen - 1] = charStr[i];
newLen--;
}
//替换空格
else
{
newChar[newLen - 1] = '0';
newChar[newLen - 2] = '2';
newChar[newLen - 3] = '%';
newLen -= 3;
}
i--;
}
result = new string(newChar);
return result;
}总结:因为新声明了两个字符串数组,空间复杂度为O(n),思路还是比较简单的。
本文介绍了一种将字符串中的空格替换为%20的算法实现,采用双字符数组的方法,通过前后扫描和指针操作达到O(n)的时间复杂度。
1667

被折叠的 条评论
为什么被折叠?



