Task5: 请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入"We are happy.",则输出"We%20are%20happy."
这道题书上给出了一种时间复杂度为O(n)的解法,从字符串的尾部开始进行复制和替换,准备指针p1和p2,P1指向原字符串的末尾,P2指向替换后的字符串末尾。之后的步骤不详细写了,这个算法也很经典了。
当我写完了这个题之后(用JAVA),我去网上搜了一些其他程序员的写法,结果却发现了一件令人匪夷所思的事情...
绝大部分的JAVA程序员的写法竟然是新建一个临时的字符数组char[] c用于存放替换后数组,并且整个替换过程遵循原算法,利用两个指针从后往前进行替换。如下:
int indexofOriginal = length - 1;
int indexofNew = newLength - 1;
System.out.println("未替换空格时的字符串:");
printArray(tempArray);
while (indexofOriginal >= 0 && indexofOriginal != indexofNew) {
if (tempArray[indexofOriginal] == ' ') {
tempArray[indexofNew--] = '%';
tempArray[indexofNew--] = '2';
tempArray[indexofNew--] = '0';
} else {
tempArray[indexofNew--] = tempArray[indexofOriginal];
}
indexofOriginal--;
}
---------------------
作者:水的化合物的专栏
来源:CSDN
原文:https://blog.csdn.net/abc7845129630/article/details/52698879
版权声明:本文为博主原创文章,转载请附上博文链接!
我当时就震惊了......如果能用到另一个临时数组的话,为什么要用书中的这种算法呢?直接从头往后替换不就行了?如下:
char[] c = s.toCharArray();
char[] current_c = new char[currentlength];
int i = 0;
int j = 0;
while(i<s.length()){
if (c[i]!=' '){
current_c[j] = c[i];
i++;
j++;
}
else
{
current_c[j] = '%';
current_c[j+1] = '2';
current_c[j+2] = '0';
i++;
j = j+3;
}
PS. 请原谅我写出这样简单粗暴又ugly的代码...我只是想帮助理解...