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;
    }
}