我有一个从0到数组长度的数字数组,除了缺少一些数字,我必须找到它。
public static Integer findNumber(Integer[] array){
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(Integer number : array){
map.put(number, 1);
}
for(Integer i=0; i<array.length; i++){
if(map.get(i)==null)
return i;
}
return -1;
}
我认为这将是一个很好的解决方案,但推出需要很长时间,排序解决方案计数重复更快,我不知道为什么。 Hash for Integer就是Integer本身,所以在计算哈希时甚至没有时间丢失,也没有用equals迭代(这取决于数字,我选择了一个只有一个副本的例子)。我觉得我在这里遗漏了一些明显的东西。我尝试指定初始容量和负载因子,但它只会使事情变得更糟。我能以某种方式对其进行优化吗?
这需要花费大量时间,而不是迭代才能找到解决方案,这样做就像95%的执行时间一样。
答案 0 :(得分:4)
你可以更简单,更快捷的方式:在数组中求和,然后从中减去它(它是从1到n的数字之和)。剩余价值是它缺失的数字。
一个注意事项:如果你的n可以是任何非负整数,你需要在Long类型上执行所有计算,这样你就不会遇到溢出。最终数字保证为整数,但乘法可以在整数范围之外。
答案 1 :(得分:0)
而不是Map,你可以使用(primitive)boolean数组。在第一个循环中,而不是将1将数组的单元格翻转为true:
boolArray[number] = true;
之后,循环数组并找到缺少的数字
答案 2 :(得分:0)
如果你坚持使用map:第二个循环不应该遍历数组,而是覆盖地图的值,搜索null值:
map.values().stream().filter(v -> v == null).findFirst();
答案 3 :(得分:-1)
我认为有一个更简单的解决方案。试试这个:
public static Integer findNumber(Integer[] array){
for(Integer i=0; i<array.length; i++){
if(i != array[i])
return i;
}
return -1;
}
希望能帮助你。