簡體   English   中英

如何在Java中優化兩個for循環(for循環內的for循環)

[英]How to optimize two for loops (a for loop inside a for loop) in java

我有以下問題:

  • 我有一個很長的字符串String str = "abcdefghiart----"
  • 現在我要遍歷字符串,並想找到字符串中的第一個重復字符
  • 我可以通過應用兩個for循環來搜索第一個重復項來實現
  • 這種方法效果很好,但是如果字符串很大並且只有最后兩個字符重復,那么迭代復雜度會很高

    現在,我想最小化復雜性並優化此代碼。 我也可以使用foreach循環進行迭代,但仍然是兩個foreach循環。 我不想使用任何系統庫。 有人可以幫我嗎?

BitSet seenCharacters = new BitSet();
for(int i=0;i<str.length(); i++) {
  if(seenCharacters.get(str.charAt(i))) {
    return str.charAt(i); // duplicate
  }
  seenCharacters.set(i);
}

...直截了當,不是嗎?

我會用其他解決方案來解決這個問題。 我將使用哈希圖(或其中的任何派生圖),鍵將是字符,並且值將為null。

然后,我將遍歷字符串,一次得到一個字符,對於得到的每個字符,我將嘗試在哈希圖中插入一個條目。 如果我無法插入它,那么我知道該字符(密鑰本身)是重復的。

這是一種查找字符串中第一個重復字符的方法。

 public static String findFirstDuplicate(String string){

                 for(int i=0;i<string.length()-1; i++){
                     String c=string.charAt(i)+"";
                     if(string.indexOf(c, i+1)>-1)
                         return  c;
                 }

                 return null;
  }

作為優化的AS,您可以通過自定義“合並排序”來優化它以查找重復值,並在找到重復值時終止。 在這里進行解釋有點復雜,但是在最壞的情況下,您可以使用修改的合並排序算法在O(nlogn)中找到第一個重復項。

定義一個大小為[26]的int數組,每個字母一個插槽

遍歷字符串,對於每個字母,檢查插槽的值是否大於0(如果是),則對應於插槽的字母是重復字符,如果為0,則將其遞增並繼續前進

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM