算法:【位运算】
位运算
- 只出现一次的数字 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}; } }