2015-04-16 54 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异常

相关问题