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

13 java arrays char

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

问题所在:写一个方法用'%20'替换字符串中的所有空格.假设字符串在字符串末尾有足够的空间来容纳其他字符,并且您获得了字符串的真实长度.我使用书籍代码,使用字符数组在Java中实现解决方案(鉴于Java字符串是不可变的):

public class Test {
    public void replaceSpaces(char[] str, int length) {
        int spaceCount = 0, newLength = 0, i = 0;

        for(i = 0; i < length; i++) {
            if (str[i] == ' ') 
                spaceCount++;
        }

        newLength = length + (spaceCount * 2);
        str[newLength] = '\0';
        for(i = length - 1; i >= 0; i--) {
            if (str[i] == ' ') {
                str[newLength - 1] = '0';
                str[newLength - 2] = '2';
                str[newLength - 3] = '%';
                newLength = newLength - 3;
            }
            else {
                str[newLength - 1] = str[i];
                newLength = newLength - 1;
            }
        }
        System.out.println(str);
    }

    public static void main(String[] args) {
        Test tst = new Test();
        char[] ch = {'t', 'h', 'e', ' ', 'd', 'o', 'g', ' ', ' ', ' ', ' ', ' ', ' '};
        int length = 6;
        tst.replaceSpaces(ch, length);  
    }
}
Run Code Online (Sandbox Code Playgroud)

我从replaceSpaces()调用中获得的输出是:%20do,它是切割原始数组的最后一个字符.我一直在摸不着头脑,有人可以向我解释为什么算法会这样做吗?

Vic*_*tor 8

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)


jax*_*axb 7

你将长度传递给6,这是造成这种情况的原因.传球长度为7,包括空间.除此以外

for(i = length - 1; i >= 0; i--) {
Run Code Online (Sandbox Code Playgroud)

不会考虑最后一个字符.

  • @Chris Camargo现在知道了。我认为您对数组索引和数组长度感到困惑。数组索引以0开头,这就是ch [6]将为'g'的原因,而ch.length为7的原因。 (2认同)

Jar*_*sen 5

通过这两个更改,我得到了输出:%20dog

1)将空格数更改为2 [因为长度已经包括%20需要的3个字符中的1个]

newLength = length + (spaceCount * 2);
Run Code Online (Sandbox Code Playgroud)

2)循环应从长度开始

for(i = length; i >= 0; i--) {
Run Code Online (Sandbox Code Playgroud)