我把这个功能写成了面试练习的一部分。此方法从给定字符串中删除字符。
我想知道如何在运行时/空间方面使这段代码更有效率。我认为我的代码是O(n),我不确定我是否可以提高效率。但是,使用诸如StringBuffer或StringBuilder之类的东西会增加一点吗?不确定,因为我对Java仍然有点新鲜。
public static String takeOut(String str, char c) {
int len = str.length();
String newstr = "";
for (int i = 0; i < len; i++) {
if (str.charAt(i) != c) {
newstr = newstr + str.charAt(i);
}
}
return newstr;
}
答案 0 :(得分:3)
字符串在Java中是不可变的,因此您的答案实际上会导致创建len
个字符串。这意味着他们被复制len
次,所以你在这里有O(N * N)代码。 StringBuilder绝对是一种更好的方法。
public static String takeOut(String str, char c) {
int len = str.length();
StringBuilder newstr = new StringBuilder();
for (int i = 0; i < len; i++) {
if (str.charAt(i) != c) {
newstr.append((char)str.charAt(i));
}
}
return newstr.toString();
}
更简单的方法是使用内置函数:
public static String takeOut(String str, char c) {
return str.replace(String.valueOf(c), "");
}
答案 1 :(得分:2)
StringBuilder
肯定会阻止您的代码在每次迭代时创建新字符串。另外,要删除的字符是否只包含在字符串中一次?然后你可以在第一场比赛后打破for
循环。此外,本地存储String#charAt
的结果不会两次调用该方法。
答案 2 :(得分:2)
你试过吗
str.replaceAll(c,"");
? 也许Java-Runtime以最快的方式替换(删除)......
答案 3 :(得分:1)
我建议更有效地更换任何字符:
1)将String
转换为char[]
数组。
2)遍历数组,逐个测试每个character
并在需要时替换它并附加到StringBuilder
我认为这可能是您在纯Java中获得的最快性能。