关于剑指offer-Task5(空格替换)中的典型错误

2018-10-17  本文已影响0人  Jocelyn_b0e1

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的代码...我只是想帮助理解...

思考:该题的重点在于,替换过程要在原字符串上进行替换,并且保证输入的字符串后面有足够多的空余内存。如果利用一个临时数组存放替换后的字符串,那么整个算法是没有意义的!

上一篇 下一篇

猜你喜欢

热点阅读