删除Java

时间:2016-04-24 23:16:55

标签: java arrays string algorithm

我开始阅读着名的“破解编码面试”一书。

  

设计算法并编写代码以删除字符串中的重复字符   不使用任何额外的缓冲区。注意:一个或两个额外的变量是好的。   数组的额外副本不是。

我在这里找到了一个类似的主题:Remove the duplicate characters in a string

作者给出的解决方案是:

  public static void removeDuplicates(char[] str) {
  if (str == null) return;
  int len = str.length;
  if (len < 2) return;

  int tail = 1;

  for (int i = 1; i < len; ++i) {
       int j;

       for (j = 0; j < tail; ++j) {
       if (str[i] == str[j]) break;
       }

       if (j == tail) {
       str[tail] = str[i];
       ++tail;
     }
  }
  str[tail] = 0;
 }

这里的问题是作者使用数组作为此函数的参数。所以我的问题是:如何用STRING作为参数编写算法?因为我觉得在这里使用一个数组真的很容易,就像你“避免运动的困难”(在我看来,我是一个新的Java开发人员)。

你怎么写这样的算法?

3 个答案:

答案 0 :(得分:3)

Java字符串是不可变的,因此您无法使用字符串来执行此操作,而无需将数组复制到缓冲区中。

答案 1 :(得分:0)

要使用String,您必须从代表修改过的str的方法返回String而不重复。不确定它是否会违反规则,但这是我用String解决问题的方法:

对于字符串中的每个字符,我会将字符串拆分为该字符。我将从后一个子字符串中删除该字符的所有实例。然后我会将前一个子串与修改后的子串连接起来,确保该字符仍然保留在它的位置。像这样的东西:

public static String removeDuplicates( String str ) {
    if( str == null || str.length() < 2 )
        return str;
    String temp;
    for( int x = 0; x + 1 < str.length(); x++ ) {
        temp = str.charAt( x ) + ""; 
        str = str.substring( 0, x ) + temp + str.substring( x + 1 ).replaceAll( temp, "" );
    }
    return str;
}

答案 2 :(得分:0)

在Java 8中,我们可以这样做

private void removeduplicatecharactersfromstring() {
    String myString = "aabcd eeffff ghjkjkl";
    StringBuilder builder = new StringBuilder();
    System.out.println(myString);
    Arrays.asList(myString.split(" "))
            .forEach(s -> {
                builder.append(Stream.of(s.split(""))
                        .distinct().collect(Collectors.joining()).concat(" "));
            });
    System.out.println(builder); // abcd ef ghjkl
}