题目描述:请实现一个函数,把字符串中的每个空格替换成"%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),思路还是比较简单的。