【问题标题】:Removing a character from a string efficiently有效地从字符串中删除一个字符
【发布时间】:2014-04-01 02:56:20
【问题描述】:

我编写了这个函数作为面试练习的一部分。此方法从给定字符串中删除一个字符。

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

【问题讨论】:

  • 不,这绝对是不是 O(n)。想想newstr = newstr + str.charAt(i) 需要做什么。想象一下,所有 n 个字符都不是您要查找的字符。 (是的,StringBuilder 就是您要找的东西。)请参阅 yoda.arachsys.com/java/stringbuffer.html - 很久以前写的,但只需在任何地方将 StringBuffer 替换为 StringBuilder
  • replaceAll() 呢?
  • 为什么不使用str.replaceAll(c+"","")
  • 我应该在问题中提到尝试不使用 replaceAll 作为挑战的一部分
  • 你见过this question?

标签: java memory big-o


【解决方案1】:

字符串在 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), "");
}

【讨论】:

  • 我认为你需要修复StringBuilder newstr = new StringBuilder();
  • 是的,我喜欢@Liondancer。这就是我熬夜和回答stackoverflow问题的结果;-)
【解决方案2】:

StringBuilder 肯定会阻止您的代码在每次迭代时创建新字符串。另外,要删除的字符在字符串中是否只包含一次?然后你可以在第一场比赛后打破for 循环。另外,将String#charAt的结果保存在本地,避免调用两次。

【讨论】:

  • 字符串内多次
【解决方案3】:

你试过了吗

str.replaceAll(c,"");

? 也许 Java-Runtime 是最快的替换(删除)方式...

【讨论】:

  • 不要问问题..回答它。 (找出你自己的统计数据)
  • 根本没有效率
【解决方案4】:

我更有效地替换任何字符的建议是:

1) 将String 转换为char[] 数组。

2) 遍历数组,逐个测试每个character,并在需要时替换它并附加到StringBuilder

我认为这可能是您在纯 Java 中获得的最快性能。

【讨论】:

    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 2011-01-03
    • 2023-03-14
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多