位运算基础与技巧
1. OR (|)
规则:只要有一个为 1 结果即为 1,全 0 则为 0。
2. AND (&)
规则:任意位与 0 相与结果为 0,与 1 相与保持不变。
3. XOR (^)
特性:无进位加法。任意位与 0 异或保持不变,相同位异或结果为 0。
3.1 相加和位
将整数转换为二进制,通过 0 和 1 位来查询进位与无进位的加法逻辑。
3.1.1 无进位去和
260. 只出现一次的数字 III - 力扣(LeetCode)
给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
示例 1:
输入: nums = [1,2,1,3,2,5] 输出: [3,5] 解释: [5, 3] 也是有效的答案。
示例 2:
输入: nums = [-1,0] 输出: [-1,0]
示例 3:
输入: nums = [0,1] 输出: [1,0]
提示:
2 <= nums.length <= 3 * 10^4-2^31 <= nums[i] <= 2^31 - 1- 除两个只出现一次的整数外,
nums中的其他数字都出现两次
public int[] singleNumber(int[] nums) {
int sum = 0;
for (int i : nums) sum ^= i; // sum: 两个不同数的 ^ 和
int tmp1 = sum & -sum; // a 和 b 不同,肯定有一位比特位为 1,tmp1: 右首 1 提纯数
// 各只出现 1 次的 不同的 两个数 和 1 位 肯定不同,一个是 0 一个是 1,各分开在 此位为 01 的 2 组中,其余出现 2 次的 都各成对分布在两组中 和为 0,分开来两组消和 两不同数各出
int[] ret = new int[];
( i : nums) {
((i & tmp1) != ) {
ret[] ^= i;
} {
ret[] ^= i;
}
}
ret;
}


