关于使用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;
}
}