/*
    给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
    示例 1:
    输入:nums = [2,2,3,2]
    输出:3
    示例 2:
    输入:nums = [0,1,0,1,0,1,99]
    输出:99
    */

    1. #include <iostream>
    2. #include <vector>
    3. #include <set>
    4. #include <map>
    5. using std::vector;
    6. using std::set;
    7. using std::map;
    8. #if 0 //使用hashSet
    9. int singleNumber(vector<int>& nums) {
    10. int sum = 0, sum1 = 0;;
    11. set<int> si;
    12. for (int num : nums)
    13. {
    14. si.insert(num);
    15. sum += num;
    16. }
    17. for (int k : si)
    18. {
    19. sum1 += k;
    20. }
    21. return (3 * sum1 - sum) / 2;
    22. }
    23. #endif
    24. #if 0
    25. int singleNumber(vector<int>& nums) {
    26. map<int, int> mii;
    27. for (int num : nums)
    28. {
    29. mii[num]++;
    30. }
    31. for (auto i = mii.begin(); i != mii.end(); i++)
    32. {
    33. if (i->second == 1)
    34. {
    35. return i->first;
    36. }
    37. }
    38. return 0;
    39. }
    40. #endif
    41. int singleNumber(vector<int>& nums) {
    42. int ans = 0;
    43. for (int i = 0; i < 32; ++i)
    44. {
    45. int total = 0;
    46. for (int num : nums)
    47. {
    48. total += ((num >> i) & 1); //对于数组中的每一个元素 xx,我们使用位运算 \texttt{(x >> i) \& 1}(x >> i) & 1 得到 xx 的第 ii 个二进制位,并将它们相加再对 33 取余,得到的结果一定为 00 或 11,即为答案的第 ii 个二进制位
    49. }
    50. if (total % 3)
    51. ans |= (1 << i);
    52. }
    53. return ans;
    54. }
    55. int main()
    56. {
    57. vector<int>nums{ 0,1,0,1,0,1,99 };
    58. std::cout<<singleNumber(nums);
    59. }