C++ 中数组中唯一元素,所有元素出现 k 次,只有一个例外
我们有一个数组 A。A 中所有元素都出现了 m 次,但只有一个元素只出现一次。我们需要找到这个唯一的元素。
所以,如果输入类似 A = [6, 2, 7, 2, 2, 6, 6],m = 3,那么输出将是 7。
为了解决这个问题,我们将遵循以下步骤:
- INT_SIZE := 整型变量大小的 8 倍
- 定义一个大小为 INT_SIZE 的数组 count,并填充 0
- 初始化 i := 0,当 i < INT_SIZE 时,更新(i 加 1),执行:
- 初始化 j := 0,当 j < size 时,更新(j 加 1),执行:
- 如果 (arr[j] AND 2^i) 不等于 0,则:
- count[i] := count[i] + 1
- res := 0
- 如果 (arr[j] AND 2^i) 不等于 0,则:
- 初始化 i := 0,当 i < INT_SIZE 时,更新(i 加 1),执行:
- res := res + ((count[i] mod m) * 2^i)
- 返回 res
- 初始化 j := 0,当 j < size 时,更新(j 加 1),执行:
让我们看看下面的实现,以更好地理解:
示例(C++)
#include <bits/stdc++.h> using namespace std; int selectUnique(unsigned int arr[], int size, int m){ int INT_SIZE = 8 * sizeof(unsigned int); int count[INT_SIZE]; memset(count, 0, sizeof(count)); for(int i = 0; i < INT_SIZE; i++) for(int j = 0; j < size; j++) if((arr[j] & (1 << i)) != 0) count[i] += 1; unsigned res = 0; for(int i = 0; i < INT_SIZE; i++) res += (count[i] % m) * (1 << i); return res; } main(){ unsigned int arr[] = { 6, 2, 5, 2, 2, 6, 6 }; int size = sizeof(arr) / sizeof(arr[0]); int m = 3; cout << selectUnique(arr, size, m); }
输入
{ 6, 2, 5, 2, 2, 6, 6 }
输出
5
广告