找数组中只出现一次的元素

Given an array of integers, every element appears twice except for one. Find that single one.  
Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 

数组中只有一个元素出现一次,其余元素都出现两次,在线性时间类,不使用额外的空间找出只出现一次的那个元素。

先上AC代码:

public class Solution {
    public int singleNumber(int[] A) {
        int n = A.length;
        if(n == 1)
            return A[0];
        int result = A[0];
        for(int i = 1 ; i < n ; i++)
        {
            result ^= A[i];//异或运算的可交换性
        }
        return result;
    }
}

这个题的标准做法是利用异或运算的这两个法则

1. a ^ b = b ^ a

2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

举个例子:

1^2^3^4^4^3^2的结果是啥呢?

一眼大概开不出来。。

根据上面两个法则,改变一下顺序吧

改成2^2^3^3^4^4^1

现在,结果显然是1.

如果其余元素都出现三次,找出那个只出现一次的元素呢?

思路:设置一个 大小为 32 (int 为 4byte) 的桶, 若 integer 在第 i 位为1, 则第 i 个桶数字加 1. 最后, 把桶里不是 3 的倍数的那些 1 组合起来拼成结果。

	public int uniqueNum(int a[])
	{
		int n = a.length;
		int[] container = new int[32];
		for(int i = 0; i < 32; i++)	//初值化这32个桶
			container[i] = 0;
		for(int i=0; i<n; i++)	//遍历每个数组元素,如果在某一位上为1,则将1加入对应的桶里
		{
			for(int j=0; j<32; j++)  
				container[j] += ((a[i]>>j) & 1);
		}
		int result = 0;
		for(int k=0; k < 32; k++)	//找出桶中“1”的个数不是3的倍数的桶
		{
			if(container[k]%3 !=0)
				result += 1<<k;		//将符合条件的桶里的数字组合就是只出现一次的数
		}
		return result;
	}


扩展:如何用一个语句判断一个整数是不是二的整数次幂?

PS:n&(n-1)==0;//二进制数只有一位位1,则该数是2的整数次幂.



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值