我有这个方法:
public static String captainCrunch(String s){
int i = 0;
char hat = ' ';
while(i < s.length()){
if(s.charAt(i) >= 'a' && s.charAt(i) <= 'm'){
hat = (char)(s.charAt(i) + 13);
}else if(s.charAt(i) > 'm' && s.charAt(i) <= 'z'){
hat = (char)(s.charAt(i) - 13);
}else if(s.charAt(i) == ' '){
hat = ' ';
}
s = s + hat;
i++;
}
return s;
}
无论何时我运行它都需要花费太多时间才能完成即使是非常小的弦乐器也能完成....任何帮助?
答案 0 :(得分:2)
您的方法花费这么长时间的原因是因为您在每次迭代中都会向s
添加字符。因此,每当循环检查其条件时,它几乎总是true
。
换句话说,您每次迭代都会为s.length()
和i
添加1。
这不好吗?解决此问题的一种方法是先将s.length()
放入变量中,以便在将新字符追加到s
时不会更改。
public static String captainCrunch(String s){
int i = 0;
char hat = ' ';
int length = s.length();
while(i < length){
if(s.charAt(i) >= 'a' && s.charAt(i) <= 'm'){
hat = (char)(s.charAt(i) + 13);
}else if(s.charAt(i) > 'm' && s.charAt(i) <= 'z'){
hat = (char)(s.charAt(i) - 13);
}else if(s.charAt(i) == ' '){
hat = ' ';
}
s = s + hat;
i++;
}
return s;
}
但是我怀疑你是否想要这样做,因为我认为你的方法试图模糊传入的字符串,而不是为它添加字符。如果我的猜测是正确的,你可能会想要这样的东西:
public static String captainCrunch(String s){
int i = 0;
StringBuilder builder = new StringBuilder(s);
while(i < s.length()){
if(s.charAt(i) >= 'a' && s.charAt(i) <= 'm'){
builder.setCharAt(i, (char)(s.charAt(i) + 13));
}else if(s.charAt(i) > 'm' && s.charAt(i) <= 'z') {
builder.setCharAt(i, (char) (s.charAt(i) - 13));
}
i++;
}
return builder.toString();
}