Shallow Dream

Keep It Simple and Stupid!

0%

找到数组中出现了k次的数

给定一个数组,里面的只有一种数出现了 k 次,其余种类的数都出现了 m 次,要求找到这个出现了 k 次的数

首先可以考虑哈希表,记录每一个数的出现次数,最后遍历哈希表所有值,找到满足情况的数

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static int hashMapTest(int[] arr, int k, int m) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : arr) {
if (map.containsKey(num)) {
map.put(num, map.get(num) + 1);
} else {
map.put(num, 1);
}
}
for (int num : map.keySet()) {
if (map.get(num) == k) {
return num;
}
}
return -1;
}

利用位运算

数组中所有的数都可以被表示为32位的整数

将数组中所有数字每一位的0或1情况进行统计

声明一个长度为32的数组,arr[i]记录 i 位上 1 出现了多少次,最后%m。

如果为0,说明这一位上出现k次的数那一位为0

如果不为0,说明这一位上出现k次的数那一位为1

最后将这个32位答案转化为十进制数就是答案

image-20220724153029401

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static int onlyKTimes(int[] arr, int k, int m) {
int[] numberBitSum = new int[32];
for (int num : arr) {
for (int i = 0; i < 32; i++) {
numberBitSum[i] += (num >> i) & 1;
}
}
int ans = 0;
for (int i = 0; i < 32; i++) {
ans |= (numberBitSum[i] % m != 0) ? (1 << i) : 0;
}
return ans;
}

额外空间复杂度:O(1)