package org.example.test;
import java.util.HashMap;
import java.util.Map;
public class BitTest {
public static void main(String[] args) {
int[] nums = {5, 4, 1, 1, 5, 1, 5};
foundOnceNumber1(nums, 3);
System.out.println(1 << 5);
}
/**
* 暴力算法
*
* @param arr
* @param k
* @return
*/
public int foundOnceNumber(int[] arr, int k) {
// write code here
Map<Integer, Integer> map = new HashMap<>();
for (int value : arr) {
if (map.get(value) == null) {
map.put(value, 1);
} else {
map.put(value, map.get(value) + 1);
}
}
for (Integer key : map.keySet()) {
if (map.get(key) == 1) {
return key;
}
}
return -1;
}
/**
* i
* 3 2 1
* 1 0 1
* 1 0 1
* 1 0 1
* 1 0 0
* 0 0 1
* 0 0 1
* 0 0 1
* <p>
* i=1: 6%3=0
* i=2:
* i=3: 4%3=1
* 如果 == 1, 表示只出现一次的数这个i为是1,遍历32位,结果相加则为只出现一次的数
*
* @param arr
* @param k
* @return
*/
public static int foundOnceNumber1(int[] arr, int k) {
if (arr == null || arr.length <= 0) {
return 0;
}
int result = 0;
for (int i = 0; i <= 31; i++) {
int curBitCnt = 0;
for (int num : arr) {
if ((num >> i & 1) != 0) {
curBitCnt++;
}
}
if (curBitCnt % k == 1) {
result += 1 << i;
}
}
return result;
}
}