只出现一次的数字 III

Posted hellodingc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只出现一次的数字 III相关的知识,希望对你有一定的参考价值。

复习了原码、反码、补码,位运算(尤其是异或,Java记作【^】)

a^b=b^a

a^0=a

a^a=0

a^b=c > a^b^b=c^b > a=c^b

注意:位运算时,符号位也是参与运算的。

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

示例 :

输入: [1,2,1,3,2,5]
输出: [3,5]

一步,两个相同数做^,得到0,所以数组全部元素做^,最后得到那两个不用元素x、y的^的结果,

二步、利用这个结果解析出其中一个元素即可。

这两个元素不相等,所以这个结果不为0,即至少有一位是1,取最低位的1(例如:1010,则取10,1100,则取100),这个1,不是来自于x,就是来自于y,设定来自x。

取最低位1的公式,m&(-m),记为low。

三步,再遍历数组。y&low===0,因为low除了一位,其他全为0,&得到0,而唯一为1的一位来自x,即y在这一位是0,所以y&low===0

当y&low!=0时,用一个值记录temp=temp^element,因为element会出现2次,所以会从结果中排除element,而y进不来,所以最后的temp就是这个x。

然后根据公式a^b=c > a^b^b=c^b > a=c^b,得到y。

public int[] singleNumber(int[] nums) {
// difference between two numbers (x and y) which were seen only once
int bitmask = 0;
for (int num : nums) bitmask ^= num;

// rightmost 1-bit diff between x and y
int diff = bitmask & (-bitmask);

int x = 0;
// bitmask which will contain only x
for (int num : nums) if ((num & diff) != 0) x ^= num;

return new int[]{x, bitmask^x};
}

 

以上是关于只出现一次的数字 III的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode只出现一次的数字i/ii/iii

Leetcode 260.只出现一次的数字III

《LeetCode之每日一题》:193.只出现一次的数字 III

力扣第260题 只出现一次的数字 III

260. 只出现一次的数字 III 的 两种解法(详细复习位运算解法)

LeetCode Java刷题笔记—260. 只出现一次的数字 III