标签:输入 iii 不为 就是 mos nta numbers ret 反码
复习了原码、反码、补码,位运算(尤其是异或,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 不为 就是 mos nta numbers ret 反码
原文地址:https://www.cnblogs.com/hellodingc/p/13056427.html