算法:【位运算】
位运算
- 只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
思路:
先对所有数字进行一次异或,得到两个出现一次的数字的异或值。
在异或结果中找到任意为 11 的位。
根据这一位对所有的数字进行分组。
在每个组内进行异或操作,得到两个数字。
class Solution {
public int[] singleNumber(int[] nums) {
int res = 0;
for(int n : nums)
res ^= n;
int div = 1;
/* 如果我们可以把所有数字分成两组,使得:
1.两个只出现一次的数字在不同的组中;
2.相同的数字会被分到相同的组中。
*/
while((div & res) == 0)
div <<= 1;
int a = 0, b = 0;
for(int n : nums){
if((div & n) == 0)
a ^= n;
else
b ^= n;
}
return new int[]{a, b};
}
}
查看17道真题和解析