编写一个方法来用'%20'替换字符串中的所有空格?

Opa*_*pal 4 java arrays string char

我对Gayl Laakmann McDowell第5版Cracking The Code Interview一书中的编程问题提出了疑问.

我不确定我的答案有什么问题?它与书中给出的答案有很大不同.

public String replace(String str){

   String[] words = str.split(" ");
   StringBuffer sentence = new StringBuffer();

   for(String w: words){
      sentence.append("%20");
      sentence.append(w);
   }

  return sentence.toString();
}
Run Code Online (Sandbox Code Playgroud)

MD-*_*-11 6

书中的问题说:

注意:如果在Java中实现,请使用字符数组,以便您可以就地执行此操作.

它还说你输入的char数组足够长,可以保存修改过的字符串.
通过使用splitStringBuffer使用额外的O(n)空间.这就是为什么你的答案变化很大而且不正确(除了增加额外的"%20").


Sto*_*ica 5

在这个循环中,程序%20在每个单词之前添加:

   for(String w: words){
      sentence.append("%20");
      sentence.append(w);
   }
Run Code Online (Sandbox Code Playgroud)

这将产生不正确的结果,例如a b它会给出%20a%20b.

有一个更简单的解决方案:

public String replace(String str) {
    return str.replaceAll(" ", "%20");
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的不想使用.replaceAll,那么写这样:

public String replace(String str) {
    String[] words = str.split(" ");
    StringBuilder sentence = new StringBuilder(words[0]);

    for (int i = 1; i < words.length; ++i) {
        sentence.append("%20");
        sentence.append(words[i]);
    }

    return sentence.toString();
}
Run Code Online (Sandbox Code Playgroud)

  • 对于您的第二个代码示例:您还可以使用第一个单词初始化StringBuilder:`StringBuilder sentence = new StringBuilder(word [0]);`. (2认同)