描述
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
数据范围:数组长度 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