Single Number 2
要求
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
标签:Bit manipulation
理解:
给定一个整数数组,其中只有一个元素出现一次,其余的都出现3次,找出出现一次的元素
线性时间复杂度,最好不适用额外的存储空间
我的提交:
int singleNumber(int A[], int n) {
//记录bit 1出现一次的位
int once=0;
//记录bit 1出现2两次的位
int twice=0;
//记录bit 1出现3三次的位
int threetimes=0;
int i;
for(i=0;i<n;i++)
{
twice |= (A[i]&once); //屏蔽所有只出现一次的位
once = once^A[i];
threetimes = once&twice;
twice &= ~threetimes;
once &= ~threetimes;
}
return once;
}
注意事项:
- 3个int,once,twice,threetimes分别记录出现1次(或3rd出现),出现2次,出现3次的数(以二进制记录);因此,once,twice,threetimes重要的不是显示的数字,而是其二进制表示
- 遍历数组
位运算分析:
1.twice |= (A[i]&once)
可拆分为:
temp=A[i]&once;
twice=twice|temp;
其中
temp=A[i]&once
:情况1:A[i]在once中有影响
结果1:temp=A[i]
情况2:A[i]在once中无影响
情况3:A[i]曾经在once有影响,当在下面的XOR被取消
结果2:temp=?
twice=twice|temp
情况1:temp==A[i]
结果1:A[i]的影响融入twice
情况2:temp==?
结果2:twice保持原状
twice包含了已出现2次的数的影响
A[i]&once:&屏蔽非A[i]的位,使A[i]的影响可以加入twice
once=once^A[i]
2.
once=once^A[i]
情况1:A[i]已出现1次
结果1:此次XOR将取消A[i]在once中的影响
情况2:A[i] 1st出现
情况3:A[i] 3rd出现
结果2:A[i]的影响(重新)融入到once中
3.
threetimes=once&twice
将出现3次,即在once与twice都有影响(once与twice对应位都是1的位)记录到threetimes中
4.
twice&=~threetimes;once&=~threetimes
取消已出现3次的数在twice与once中的影响,排除这些数
经过n次循环后,once中的位就是只出现一次的数的影响,是其二进制表示
Bit Manipulation is an Amazing tool!
P.S:此解法可能由于参考了其他解法而导致有相似之处,感谢他们的分享!也欢迎各位学友都对我的解法的不足之处作出建议!