Java:将空间替换为%20。为什么打印的是%20 A先生而不是%20 A先生
您好,我正在尝试将字符串中的空格替换为%20。 例子 输入:A先生 输出:Mr%20A 我无法理解为什么我的代码会打印“Mr%20 A”。我想打印“Mr%20A”,请告诉我如何打印?这是我的密码: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) {
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();
}