(1)leetcode里1346题
给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
更正式地,检查是否存在两个下标 i 和 j 满足:
i != j
0 <= i, j < arr.length
arr[i] == 2 * arr[j]
class Solution {
public:
bool checkIfExist(vector<int>& arr) {
map<int,int>mymap;
int count0=0;
for(int i=0;i<arr.size();++i)
{
if(arr[i]==0)
{
count0++;
if(count0==2)return 1;
}
mymap[arr[i]]=arr[i]*2;
}
for(int i=0;i<mymap.size();++i)
{
if(mymap[mymap[arr[i]]]!=0)return 1;
}
return 0;
}
};
原因:使用map[]访问不存在的关键字后会自动将这个关键字加入map,对应值为默认值。因此最后for循环中mymap.size()随着访问不存在的关键字会不断增大,而mymap.size()增大又会继续循环,导致死循环。(实际上这里没有死循环,关键字过大之后直接报错了)
解决方法:可以先记录mymap.size(),然后使用这个做记录的数作为循环的判断条件
(2)此外,map中还有一个容易导致死循环的地方,就是关于map.size()的使用,它的返回值为一个无符号整型,比如运行如下代码:
map<int, int>my;
cout << my.size()-1;
输出并不会为-1,而是会变成一个很大的值,比如x64:
解决方法:将其转换为int类型即可:
int(my.size()-1)