码迷,mamicode.com
首页 > 其他好文 > 详细

只出现一次的数字 III

时间:2020-06-06 21:56:13      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:输入   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

标签:输入   iii   不为   就是   mos   nta   numbers   ret   反码   

原文地址:https://www.cnblogs.com/hellodingc/p/13056427.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!