思路:
利用异或运算^
1. a^a =0
2. a^0=a
然后运算满足交换率
即
a^b^a=a^a^b
最后就可以得出 b是单身狗
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public int singleNumber(int[] nums) { int x = 0; System.out.println(12^1); for (int num : nums){ x ^= num; System.out.println(x);
} return x; } }
|
变种:字节后端,变成有序数组,需要O(logN)复杂度。 思路:二分查找,如果nums[mid]出现了两次,则左边或右边肯定有一边剩余了奇数个数字,朝奇数个的方向走。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int singleNonDuplicate(int[] nums) { int l = 0, r = nums.length - 1; while (l < r) { int mid = l + (r - l) / 2; if (nums[mid] == nums[mid ^ 1]) { l = mid + 1; } else { r = mid; } } return nums[l]; } }
|

思路:
- 调用函数 Integer.bitCount(x) 统计x中 为1的个数
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public int hammingDistance(int x, int y) { System.out.println(0 ^ 6); System.out.println(1 ^ 6); System.out.println(6 ^ 6); return Integer.bitCount(x ^ y); } }
|