面试题56 - I. 数组中数字出现的次数
两个相同的数字异或得0,一个数与0异或得自身。
因此这一串数字异或下来就得到两个数字x,y的异或z。那么z里为1的一位就意味着x,y在这一位一个为0一个为1。
可以任取z里为1的一位与其他数字位与,可以将数组分为在这一位为0的一组和在这一位为1的另一组。然后分别对两组取异或就取出了x,y。
func singleNumbers(nums []int) []int {
ans:=0
for _,v:=range nums{
ans^=v
}
tmp:=1
for ans%2==0{
ans>>=1
tmp<<=1
}
ans1,ans2:=0,0
for _,v:=range nums{
if v&tmp==0{
ans1^=v
}else{
ans2^=v
}
}
return []int{ans1,ans2}
}