4 回答

TA貢獻1796條經驗 獲得超4個贊
您可以使用distinct():
StringBuilder sb = new StringBuilder();
yourstr.chars().distinct().forEach(c -> sb.append((char) c));
最好的

TA貢獻1804條經驗 獲得超2個贊
有幾件事是錯誤的。您應該在循環中與字符串生成器進行比較,而不是與字符串本身進行比較,因為它會發生變化。其次,您在刪除時使用了錯誤的索引。這是正確的程序:
public static void removeDuplicate(String s) {
StringBuilder sb = new StringBuilder(s);
for(int i = 0; i < sb.length(); i++) {
for(int j = i + 1; j < sb.length(); j++) {
if(sb.charAt(i) == sb.charAt(j)) {
sb.deleteCharAt(j);
}
}
}
System.out.print("Duplicates have been, the resulting string is => " + sb);
}
public static void main(String[] args) {
String s = "bananas";
removeDuplicate(s);
}
輸出是:
重復了,結果字符串是 => bans

TA貢獻1813條經驗 獲得超2個贊
好吧,在循環中從集合中刪除元素是一個壞主意,因為它可能會導致基于索引更改的錯誤邏輯。只需放置一些特殊情況,例如“baaana”,您的解決方案將很容易失敗,因為當您嘗試在索引 2 處找到“a”時,您將其刪除并跳過與“實際”索引 3 的比較,因為它的索引在刪除后降至 2 . 還有一件事你應該知道。在 Java 中,String 是不可變的,這意味著當您更改字符串時,實際上是用新的變量分配了該變量。所以這些函數應該返回一個新的字符串而不是修改輸入。
對于這種類型的問題,我建議您應該使用哈希數據類型來記住不同的元素,這樣您就可以用 O(n) 時間復雜度來解決這個問題。
public static String removeDuplicate(String s) {
StringBuilder sb = new StringBuilder();
Set<Character> metChars = new HashSet<>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(!metChars.contains(c)) {
sb.append(c);
metChars.add(c);
}
}
return sb.toString();
}

TA貢獻1786條經驗 獲得超13個贊
基本上,當您刪除 中的字符時StringBuilder
,您會有效地更改所有其他字符的索引。
在您的示例bananas
中,如果您刪除第二個 a (位置 3,因為我們從 0 開始),您將得到 string bannas
。然后,當您要刪除 的第三個 a 時bananas
,在 pos 5,您最終會刪除 s。
添加回答
舉報