Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:将空间替换为%20。为什么打印的是%20 A先生而不是%20 A先生_Java_Algorithm - Fatal编程技术网

Java:将空间替换为%20。为什么打印的是%20 A先生而不是%20 A先生

Java:将空间替换为%20。为什么打印的是%20 A先生而不是%20 A先生,java,algorithm,Java,Algorithm,您好,我正在尝试将字符串中的空格替换为%20。 例子 输入:A先生 输出:Mr%20A 我无法理解为什么我的代码会打印“Mr%20 A”。我想打印“Mr%20A”,请告诉我如何打印?这是我的密码: import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestAnswer { public static void main(String[] args) {

您好,我正在尝试将字符串中的空格替换为%20。 例子 输入:A先生 输出:Mr%20A

我无法理解为什么我的代码会打印“Mr%20 A”。我想打印“Mr%20A”,请告诉我如何打印?这是我的密码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestAnswer {



    public static void main(String[] args) {
        //System.out.println(isPermutation("aXbcx", "xbcaX"));
        System.out.println(URLify("Mr A"));
    }


    static String URLify(String s){
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < s.length(); i++){
            char  c = s.charAt(i);
            if(c == ' '){
                sb.append("%20");

            }

            sb.append(c);

        }

        return sb.toString();
    }

}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公开类测试解答{
公共静态void main(字符串[]args){
//System.out.println(isPermutation(“aXbcx”、“xbcx”);
System.out.println(URLify(“mra”);
}
静态字符串URLify(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
在附加
%20“
(在
c=''
的情况下)之后,还附加
c

char  c = s.charAt(i);
if(c == ' '){
    sb.append("%20");
}
sb.append(c); //here
解决方案是仅当
不是
'
时才附加
c

解决方案:

char  c = s.charAt(i);
if(c == ' '){
    sb.append("%20");
}else{
    sb.append(c);
}

<> >而不是循环使用<代码>字符串< /代码>,并使用<代码> StringBuilder < /代码>重新创建它,考虑使用这一行代码:

s = s.replace(" ", "%20");
评出

//System.out.println(isPermutation("aXbcx", "xbcaX"));
我可以看出你正在解决CTCI问题

@sudo回答了你的问题,我只是想提出一个更好的解决方案

您的解决方案可能已经足够好了,但值得解释的是,StringBuilder.append将使字符数组大小加倍,如果容量不足,则每个append将包含字符串,直到它能够容纳字符串为止

我的解决方案将在原始字符串上迭代两次,但不会扩展返回的字符数组

private static char[] URLify(char[] original) {
    char charToReplace = ' ';
    char[] replacement = new char[]{'%', '2', '0'};
    // count charToReplace, in our case, count spaces
    int numCharsToReplace = 0;
    for (char c : original) if (c == charToReplace) numCharsToReplace++;
    // creating new fixed char array to return
    int resultSize = original.length + (numCharsToReplace * replacement.length) - numCharsToReplace;
    char[] result = new char[resultSize];
    // we need two indexes,one to iterate the result char array, second to iterate the original
    int i = 0, originalIdx = 0;
    // until we set all new array of chars cells
    while (i < resultSize) {
        // get original character
        char curOriginalChar = original[originalIdx];
        // this condition is first because I assume real URL will not contain as much spaces as chars
        // if current character is not one we need to replace, copy
        if (curOriginalChar != charToReplace) {
            result[i] = curOriginalChar;
            // for readable code the index incremented in new line
            // could be replaced with "result[i++] = curOriginalChar;"
            i++;
        }
        else {
            for (char c : replacement) {
                result[i] = c;
                i++;
            }
        }
        originalIdx++;
    }
    return result;
}
用法示例

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String original = "Mr & Mrs Smith";
        char[] urlify = URLify(original.toCharArray());
        System.out.println(new String(urlify) + "|" + urlify.length);

        StringBuilder sb = new StringBuilder();
        for (char c : original.toCharArray())
            if (c != ' ') sb.append(c);
            else sb.append("%20");
        System.out.println(sb.toString() + "|" + getStringBuilderCharSize(sb));
    }
输出:

Mr%20&%20Mrs%20Smith|20
Mr%20&%20Mrs%20Smith|34

已保存14个单元格;)

在代码中,检查字符是否为空格,并在StringBuilder中追加“%20”。但是,if条件后面的sb.append(c)语句也会导致追加空格。 您可以在if案例中附加“%20”后添加continue关键字

因此,您的代码应该如下所示:

static String URLify(String s){
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < s.length(); i++){
            char  c = s.charAt(i);
            if(c == ' '){
                sb.append("%20");
                continue;
            }

            sb.append(c);

        }

        return sb.toString();
    }
静态字符串URLify(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
s.replace(“,“%20”)
?为什么不直接使用?@sudo,因为那样会用
+
而不是
%20
替换空格?我可以提一下吗?M技术,很高兴看到你在堆栈溢出(三个问题到现在为止,对所有三个问题都有很好的答案,不是吗?)请考虑是否和何时接受一个合适的答案。看见
static String URLify(String s){
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < s.length(); i++){
            char  c = s.charAt(i);
            if(c == ' '){
                sb.append("%20");
                continue;
            }

            sb.append(c);

        }

        return sb.toString();
    }