给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。
示例 :
输入:[1,2,1,3,2,5]
输出:[3,5]
答案:
1public int[] singleNumber(int[] nums) {
2 int diff = 0;
3 for (int num : nums) {
4 diff ^= num;
5 }
6 diff &= -diff;
7 int[] rets = {0, 0};
8 for (int num : nums) {
9 if ((num & diff) == 0) {
10 rets[0] ^= num;
11 } else {
12 rets[1] ^= num;
13 }
14 }
15 return rets;
16}
解析:
之前我们讲过140,只出现一次的数字和272,只出现一次的数字 II,这题解法也比较多,这里只列出了这一种解法,如果想了解更多,可以参照前面两道题的解法。题目说了只有两个数出现了一次,其他的都出现了2次,我们把所有值都异或一遍,异或的结果就是那两个只出现一次的异或值,因为出现两次的异或结果都为0。因为这两个值不相同,所以他们的异或结果肯定不为0,也就是说这个结果转化为二进制的某一位上肯定有1,我们就根据这个1可以把数组分为两个部分,并且这两个只出现一次的肯定不会在同一组,根据这个特性我们很容易就能找到这两个值。