2015-04-16 2 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. Но я не думаю, что это связано с проблемой алгоритма. Поэтому я размещаю его здесь. Здесь проблема:
Я использую запись «hashmap» для записи дублированных символов в S и еще одну «установленную» для записи дублированных символов в T. Когда число дублированных символов равно, плюс один для переменной " рассчитывать ";
я прошел все испытания, кроме последнего S является строка длины 100000 и Т представляет собой строку с длиной 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: The JVM кэширование целых значений. == работает только для чисел от -128 до 127

+0

@deathlee, ваша проблема решена? –

1

Поскольку ценность ваших карт составляет Integer. Целое - это объекты и их нужно сравнивать с помощью метода equals.

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

Так я могу так понять? Первые 265 случаев прошли из-за пула Integer, такого как строка. И из-за того, что целое число в последнем случае слишком велико для хранения в пуле. Поэтому «==» стало бесполезным. – deathlee

+0

@deathlee Да, это все. – Jens

1

а это «автобоксирующая ловушка», вы помещаете Integer в запись и настройку. Если вы вызываете метод get, вы получаете два значения Integer, которые должны сравниваться с equals. Когда вы пишете

int num1 = record.get(tmp); 

2 различных операций случаются

  1. Получить Integer
  2. Преобразовать целое в целое (так что вы можете использовать ==)

другой ловушка с нулем object it Integer null

int num1 = record.get(tmp); 

дает вам NullPointerException

Смежные вопросы