有效地从字符串中删除字符

时间:2014-02-28 08:05:00

标签: java memory big-o

我把这个功能写成了面试练习的一部分。此方法从给定字符串中删除字符。

我想知道如何在运行时/空间方面使这段代码更有效率。我认为我的代码是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;
}

4 个答案:

答案 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中获得的最快性能。