力扣:最小覆盖子串(关于使用map记录数据单数据过大时、缓存问题、自动包装的锅

关于使用map记录数据单数据过大时

题目:最小覆盖子串

错误代码:(最后一个数据错误)

class Solution {
    public String minWindow(String s, String t) {
        HashMap<Character,Integer>map=new HashMap<>();//记录s串的窗口滑动时串口内的需要的字母个数
        HashMap<Character,Integer>map1=new HashMap<>();//记录t串每个字母出现的次数
        LinkedList<node>list=new LinkedList<>();//队列记录串的进出顺序
        
        //初始化
        int count=0;
        int max=999999,left=0,right=-1;
        for (int i = 0; i < t.length(); i++) {
            if(map1.get(t.charAt(i))==null)
                map1.put(t.charAt(i),0);
            else map1.put(t.charAt(i),map1.get(t.charAt(i))+1);
            map.put(t.charAt(i),0);
        }
        //开始滑动,i代表窗口右边
        for (int i = 0; i < s.length(); i++) {
            if(map.get(s.charAt(i))!=null){
            	//当窗口内的字母数全都大于等于需要的字母数时,计数加1
                if(map.get(s.charAt(i))<=map1.get(s.charAt(i))){
                    count++;
                }
                map.put(s.charAt(i),map.get(s.charAt(i))+1);
                list.add(new node(i,s.charAt(i)));
                //左边开始收缩
                while(count==t.length()){
                    node c = list.poll();
                    map.put(c.c,map.get(c.c)-1);
                    if(map.get(c.c)==map1.get(c.c))count--;
                    int len=i-c.x;
                    //寻找符合条件最短子串
                    if(max>len){
                        max=len;
                        left=c.x;
                        right=i;
                    }
                }
            }
        }
        return s.substring(left,right+1);
    }
}
class node{
    int x;
    Character c;
    node(int xx,char cc){
        x=xx;
        c=cc;
    }
}

评论区大神 EiletXie:

  • 我想说的是 Java 用Map记录字母出现个数的写法, 最后一个测试用例通不过时,要明白一件事。 Integer是对象啊。。。
    Integer会缓存频繁使用的数值, 数值范围为-128到127,在此范围内直接返回缓存值。 超过该范围就会new 一个对象。
    浪费了我两个小时,希望有这种情况的老哥注意一下。

评论区大神 夺子姐:
拆箱的问题,查了下资料它是有一个缓冲池,在-128到127之间,这之间的数并没有直接创建新的Integer对象,而是直接从缓存池中拿的。所以他们是相同的引用,用==比较时都是返回true,但是这些数之外的就是新创建的Integer对象,不可能是相同的。

注:不只是Integer有这个问题。

AC代码:

class Solution {
    public String minWindow(String s, String t) {
        HashMap<Character,Integer>map=new HashMap<>();
        HashMap<Character,Integer>map1=new HashMap<>();
        LinkedList<node>list=new LinkedList<>();
        int count=0;
        int max=999999,left=0,right=-1;
        for (int i = 0; i < t.length(); i++) {
            if(map1.get(t.charAt(i))==null)
                map1.put(t.charAt(i),0);
            else map1.put(t.charAt(i),map1.get(t.charAt(i))+1);
            map.put(t.charAt(i),0);
        }
        for (int i = 0; i < s.length(); i++) {
            if(map.get(s.charAt(i))!=null){
                if((int)map.get(s.charAt(i))<=(int)map1.get(s.charAt(i))){//这里做了修改,把Integer强制转换为int
                    count++;
                }
                map.put(s.charAt(i),map.get(s.charAt(i))+1);
                list.add(new node(i,s.charAt(i)));
                while(count==t.length()){
                    node c = list.poll();
                    map.put(c.c,map.get(c.c)-1);
                    if((int)map.get(c.c)==(int)map1.get(c.c))count--;//这里也是(把"=="改用equal来比较也可以)
                    int len=i-c.x;
                    if(max>len){
                        max=len;
                        left=c.x;
                        right=i;
                    }
                }
            }
        }
        return s.substring(left,right+1);
    }
}
class node{
    int x;
    Character c;
    node(int xx,char cc){
        x=xx;
        c=cc;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值