【问题标题】:Fastest way to find duplicates in a string without using any additional memory in java?在java中不使用任何额外内存的情况下查找字符串中重复项的最快方法?
【发布时间】:2009-11-06 01:44:00
【问题描述】:

在 Java 中不使用额外内存的情况下删除字符串中重复字符的最快方法是什么?

【问题讨论】:

  • 如果您提供一些示例,我将非常乐意提供帮助。
  • 真的不需要例子,这是关于字符串相关结构的内部过程的问题。
  • 鉴于字符串在 Java 中是不可变的,您至少需要为删除了字符的新字符串“额外内存”。如果您能澄清“额外记忆”的含义,那就太好了。此外,请记住,内存使用量和速度之间经常需要权衡取舍。
  • 你提前知道重复字符,还是找到所有重复字符然后删除它们?
  • @kunjaan,准确了解您的意思确实会有所帮助。你的意思是“bookkeeper”变成了“bokeper”,还是“bokepr”,或者只是一个包含这6个字符的字符串,或者其他什么?

标签: java string


【解决方案1】:

StringBuilder 中使用indexOfdelete 方法。

【讨论】:

  • StringBuilder 不会使用额外的内存,因为您正在复制字符串,使其可变?
  • StringBuilder 对象的目的是在不需要新的不可变字符串副本的情况下执行这些操作。
【解决方案2】:

由于字符串是不可变的,您将无法更改它。因此,没有重复字符的新版本字符串会消耗内存。如果您在请求的目的和理由背后提供更多详细信息,那么有人可能会提供更好的方法。

【讨论】:

    【解决方案3】:

    因为字符串在 Java 中是不可变的,所以无论如何您都需要至少一份。 Ans 最好的方法是使用字符数组和 System.arraycopy。另一种选择是 StringBuilder/StringBuffer 和 CharBuffer。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      String 是不可变的,因此实际情况是您需要分配额外的内存。

      既然你说最快,我假设你不会考虑 2 遍算法。您可以使用 StringBuilder ,但这将分配您的原始字符串长度 + 16,并且当您调用 getString() 时,您将再次在 String 构造函数中分配内存。

      如果您不介意使用 2 遍算法,您正在查看 char[] 的 2 次分配(清理字符串的最终长度)。使用 StringBuilder,你会看到 2*len + 16,但它会更快。

      【讨论】:

        【解决方案5】:

        您应该使用 StringBuilder。但是,这里有一种方法,你可以用它来打自己的脚:

            String s = "bookkeepers";
            Class<?> c = String.class;
            Field field = c.getDeclaredField("value");
            field.setAccessible(true);
            char[] value = (char[]) field.get(s);
            // remove duplicate characters
            char last = 0;
            int len = 0;
            int writePtr = 0;
            for(int i = 0; i < value.length; i++) {
                value[writePtr] = value[i];
                if (value[i] != last) {
                    writePtr++;
                    last = value[i];
                    len++;
                }
            }
            Field count = c.getDeclaredField("count");
            count.setAccessible(true);
            count.set(s, len);
        
            System.out.println(s);
        

        输出bokepers

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-05
          • 1970-01-01
          • 2014-02-09
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 1970-01-01
          相关资源
          最近更新 更多