我开始阅读着名的“破解编码面试”一书。
设计算法并编写代码以删除字符串中的重复字符 不使用任何额外的缓冲区。注意:一个或两个额外的变量是好的。 数组的额外副本不是。
我在这里找到了一个类似的主题: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开发人员)。
你怎么写这样的算法?
答案 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
}