亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我的算法給我不正確的重復刪除值有什么問題?

我的算法給我不正確的重復刪除值有什么問題?

慕沐林林 2022-07-27 10:08:29
我正在嘗試刪除字符串中的重復項,但我不確定為什么我的算法是錯誤的。它給了我一個輸出,baa而不是bans正確的輸出。在嘗試調試期間,我嘗試將其切換i到j內部sb.deleteCharAt();,但這給了我一個Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5 錯誤。我做錯了什么,我該如何解決?這是我的代碼:public static void removeDuplicate(String s) {    StringBuilder sb = new StringBuilder(s);    for(int i = 0; i < s.length(); i++) {        for(int j = i + 1; j < s.length(); j++) {            if(s.charAt(i) == s.charAt(j)) {                sb.deleteCharAt(i);            }        }    }    System.out.print("Duplicates have been, the resulting string is => " + sb);}public static void main(String[] args) {    String s = "bananas";    removeDuplicate(s);}
查看完整描述

4 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

您可以使用distinct():


StringBuilder sb = new StringBuilder();

yourstr.chars().distinct().forEach(c -> sb.append((char) c));

最好的


查看完整回答
反對 回復 2022-07-27
?
慕婉清6462132

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



查看完整回答
反對 回復 2022-07-27
?
慕姐8265434

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();

}


查看完整回答
反對 回復 2022-07-27
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

基本上,當您刪除 中的字符時StringBuilder,您會有效地更改所有其他字符的索引。

在您的示例bananas中,如果您刪除第二個 a (位置 3,因為我們從 0 開始),您將得到 string bannas。然后,當您要刪除 的第三個 a 時bananas,在 pos 5,您最終會刪除 s。


查看完整回答
反對 回復 2022-07-27
  • 4 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號