java - 使用 Hashmap 查找单个整数

标签 java arrays hashmap

一个编码问题:给定一个整数数组,除一个元素外,每个元素出现两次。找到那个单一的。它需要线性运行时复杂度

我的解决方案:

public class Solution {
    public int singleNumber(int[] A) {
    HashMap<Integer, Integer> lut = new HashMap<Integer, Integer>();
     for (int i=0; i<A.length; i++){
         if(lut.containsKey(A[i])){
             lut.remove(A[i]);
         }
         else{
             lut.put(A[i],1);
         }
     }

     Set<Integer> keys = lut.keySet();
     System.out.println(keys.size());
     for(Integer integer: keys)
         return integer;

     return (Integer) null;
 }

我认为复杂度是O(n),因为它只遍历数组一次,而HashMap 使用固定的时间来获取一个元素。但是网上判断后说我的代码time limit。有人可以指出为什么这超过了时间限制吗?如何改进?

最佳答案

我怀疑时间限制是根据特定的实现方式设置的。你的解决方案看起来对我来说应该是线性时间 - 但它可能是一个比这段代码大得多的常数:

public int findSingleNumber(int[] array) {
    int result = 0;
    for (int item : array) {
        result ^= item;
    }
    return result;
}

这利用了这样一个事实,即除了我们想要的项目之外的所有项目都恰好出现两次,因此如果将它们异或在一起,它们将相互抵消。我们只剩下我们正在寻找的数字。

我想补充一点,像这样的谜题很有趣并且可以拓展思维 - 但解决方案很少是您想要在实际应用中使用的。

关于java - 使用 Hashmap 查找单个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28804085/

相关文章:

arrays - 快速创建动态大小数组

javascript - 使用 lodash 按属性连接对象数组

java - 在Map线性或常量上调用values().size()

java - 在 PHP 中将 "raw"字符串格式化为 Java UUID

java - 聚合和聚合根是否作为单独的类实现?

java - @Autowired 类中的监听器被调用两次

java - 图形+java中定位字符串

java - java中如何比较字符串并将结果保存到字符串数组中?

java - 为什么 Map 的 containsKey() 只调用 hashCode()?

java - 迭代有序的 HashMap 条目对的最快方法