一个位运算问题
如果有一个数组,这个数组中只有一个数出现的次数不够m次,其他数出现次数都等于m次,那么求这个数
思路:创建一个31位的mask数组,将每一位上出现的次数加起来,哪一位出现次数不为m的倍数,那么哪一位就是所求数的一部分
// 已知数组中只有1种数出现次数少于m次,其他数都出现了m次
// 返回出现次数小于m次的那种数
public static int find(int[] arr, int m) {
// cnts[0] : 0位上有多少个1
// cnts[i] : i位上有多少个1
// cnts[31] : 31位上有多少个1
int[] cnts = new int[32];
for (int num : arr) {
for (int i = 0; i < 32; i++) {
cnts[i] += (num >> i) & 1;
}
}
int ans = 0;
for (int i = 0; i < 32; i++) {
if (cnts[i] % m != 0) {
ans |= 1 << i;
}
}
return ans;
}

浙公网安备 33010602011771号