我觉得本题过于Tricky了,虽然是Medium,但是对于Bit Manipulation来说,有些Medium甚至比Hard更加烧脑
    我在Discuss中找到了一个还算比较简单的解法,也准备模仿这个,大致思路:

    • int 是 32位
    • 把这32位分开来看:

      • 对于第n位来说,这个位上的所有数字加在一起为sum
      • 137. Single Number II - 图1应该等于single number在第n位的数字
      • 所以可以通过这个方法,反向构建Single Number
    • 空间复杂度:137. Single Number II - 图2

    • 时间复杂度:137. Single Number II - 图3,也可以等价为137. Single Number II - 图4

    代码如下:

    1. class Solution {
    2. public int singleNumber(int[] nums) {
    3. int singleNum = 0;
    4. for (int shift = 0; shift < 32; ++shift) {
    5. int acc = 0;
    6. for (int num : nums) {
    7. if (((num >> shift) & 0x01) == 1) {
    8. acc++;
    9. }
    10. }
    11. singleNum |= ((acc % 3) << shift);
    12. }
    13. return singleNum;
    14. }
    15. }