HashMap与整数很长时间

时间:2016-07-11 09:13:13

标签: java algorithm hashmap

我有一个从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%的执行时间一样。

4 个答案:

答案 0 :(得分:4)

你可以更简单,更快捷的方式:在数组中求和,然后从sum from 1 to n中减去它(它是从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;
}

希望能帮助你。