我有这个方法:
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;
}
每当我运行它时,即使对于非常小的字符串,也需要像 ferver 一样花费太多时间才能完成......有什么帮助吗?
最佳答案
您的方法花费如此长的时间的原因是您在每次迭代中都向 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();
}
关于Java 方法需要很长时间才能运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39223553/