一个位运算问题

如果有一个数组,这个数组中只有一个数出现的次数不够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;
	}
posted @ 2026-03-02 16:07  Lambda_L  阅读(0)  评论(0)    收藏  举报