任何人都可以看到为什么这里的两个“整数”无法比较?

时间:2015-04-16 11:52:34

标签: java

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“record”记录S中的重复字符,另一个“set”记录T中的重复字符。当重复字符的数量相等时,加上一个变量“count”;
我通过了所有测试,除了最后一个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个测试用例可以通过,但最后一个大字符串会导致问题?提前谢谢。

3 个答案:

答案 0 :(得分: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之间的数字

答案 1 :(得分:1)

因为地图的价值为Integer。整数是对象,必须使用equals方法进行比较。

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

答案 2 :(得分:1)

它是一个“自动装箱”,你将Integer放入记录并设置。如果你调用get方法,你得到两个整数,必须与equals进行比较。 当你写

int num1 = record.get(tmp);

发生2次不同的行动

  1. 检索整数
  2. 将整数转换为int(这样您就可以使用==
  3. 另一个陷阱是null对象,Integer为null

    int num1 = record.get(tmp);
    

    给你一个NullPointerException