2015-04-16 81 views
0
public String minWindow(String S, String T) { 
    if (T.length() > S.length()) 
     return ""; 
    HashMap<Character, Integer> set = new HashMap<>(); 
    for (int i = 0; i < T.length(); i++) { 
     if (!set.containsKey(T.charAt(i))) { 
      set.put(T.charAt(i), 1); 
     } else { 
      set.put(T.charAt(i), set.get(T.charAt(i)) + 1); 
     } 
    } 
    int count = 0; 
    int min = Integer.MAX_VALUE; 
    int begin = 0; 
    int end = 0; 
    LinkedList<Integer> index = new LinkedList<>(); 
    HashMap<Character, Integer> record = new HashMap<>(); 
    for (int i = 0; i < S.length(); i++) { 
     Character tmp = S.charAt(i); 
     if (set.containsKey(tmp)) { 
      index.add(i); 
      if (record.containsKey(tmp)) { 
       record.put(tmp, record.get(tmp) + 1); 

      } else { 
       record.put(tmp, 1); 
      } 

      int num1 = record.get(tmp); 
      int num2 = set.get(tmp); 
      if (num1 == num2) { 
       count++; 
      } 
      if (count == set.size()) { 
       Character head = S.charAt(index.peek()); 
       while (record.get(head) > set.get(head)) { 
        record.put(head, record.get(head) - 1); 
        index.remove(); 
        head = S.charAt(index.peek()); 
       } 
       if (index.getLast() - index.peek() < min) { 
        min = index.getLast() - index.peek(); 
        begin = index.peek(); 
        end = index.getLast(); 
       } 
      } 
     } else { 
      continue; 
     } 
    } 
    if (min == Integer.MAX_VALUE) { 
     return ""; 
    } else { 

     return S.substring(begin, end + 1); 
    } 
} 

這是我的一個Leetcode問題的代碼。但我不認爲它涉及算法問題。所以我把它張貼在這裏。這裏是問題:
我使用散列表「記錄」來記錄S中重複的字符和另一個「set」來記錄T中重複的字符。當重複的字符數相等時,加上一個變量「計數」;
我通過了所有試驗除了最後一個S爲長度100000的字符串和T是具有長度10001
字符串我必須使用這種形式:
有人可以看到爲什麼在這裏兩個「整數」不能比較?

  int num1 = record.get(tmp); 
      int num2 = set.get(tmp); 
      if (num1 == num2) { 
       count++; 
      } 

代替:

  if(record.get(tmp)==set.get(tmp)){ 
       count++; 
      } 

只有這樣才能將兩個整數進行比較或不計算「計數」。爲什麼前265個測試用例可以通過,但最後一個大字符串會導致問題?先謝謝你。

回答

1

它正在返回Integer而不是int,因爲您有HashMap<Character, Integer>,所以它沒有給出==的預期輸出。

您可以使用

if(record.get(tmp).equals(set.get(tmp))){ 

你可以看一下this (difference between an int and an Integer)以及this (Integer equals vs. ==)答案


爲什麼第265測試用例可以通過,但最後的大串原因導致的問題?

Answer:的JVM是緩存整數值。 ==只適用於-128和127之間的數字

+0

@deathlee,你的問題得到解決了嗎? –

1

因爲您的地圖的價值是Integer。整數是對象,必須使用equals方法進行比較。

if(record.get(tmp).equals(set.get(tmp))){ 
+0

我能這樣理解嗎?由於Integer池像字符串一樣通過了前265個例子。並且由於最後一種情況下的整數太大而無法存儲在池中。所以「==」變得毫無用處。 – deathlee

+0

@deathlee就是這樣。 – Jens

1

這是一個「自動裝箱陷阱」,你把整數記錄下來並設置好。如果您調用get方法,則會得到兩個整數,因此必須與equals進行比較。 當你寫

int num1 = record.get(tmp); 

2個不同的操作發生

  1. 檢索整數
  2. 轉換整數爲int(所以你可以使用==

另一個陷阱是空對象它整數爲零

int num1 = record.get(tmp); 

給你一個NullPointerException異常

相關問題