Day36:数组中只出现一次的两个数字

89 阅读1分钟

描述

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度 2≤�≤10002≤n≤1000,数组中每个数的大小 0<���≤10000000<val≤1000000
要求:空间复杂度 �(1)O(1),时间复杂度 �(�)O(n)

题源:数组中只出现一次的两个数字_牛客题霸_牛客网 (nowcoder.com)

提示:输出时按非降序排列。

示例1

输入:

[1,4,1,6]

复制

返回值:

[4,6]

复制

说明:

返回的结果中较小的数排在前面     

示例2

输入:

[1,2,3,3,2,9]

复制

返回值:

[1,9]
方法一:哈希表(推荐使用)

知识点:哈希表

哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构。而这种直接访问意味着只要知道key就能在�(1)O(1)时间内得到value,因此哈希表常用来统计频率、快速检验某个元素是否出现过等。

思路:

既然有两个数字只出现了一次,我们就统计每个数字的出现次数,利用哈希表的快速根据key值访问其频率值。

具体做法:

  • step 1:遍历数组,用哈希表统计每个数字出现的频率。
  • step 2:然后再遍历一次数组,对比哈希表,找到出现频率为1的两个数字。
  • step 3:最后整理次序输出。
public int[] FindNumsAppearOnce (int[] array) {
        HashMap<Integer, Integer> map = new HashMap();
        for (int i = 0; i < array.length; i++) {
            if (!map.containsKey(array[i])) {
                map.put(array[i], 1);
            } else {
                map.put(array[i], map.get(array[i]) + 1);
            }
        }
        int ans[] = new int[2];
        int j = 0;
        for (Integer temp : map.keySet()) {
            if (map.get(temp) == 1) {
                ans[j++] = temp;
            }
        }
        Arrays.sort(ans);
        return ans;
    }
复杂度分析
  • 时间复杂度:O(n),其中�n为数组长度,两次单独的遍历数组每个元素
  • 空间复杂度:O(n),哈希表的长度应该为(n−2)/2