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

转载 2014年11月13日 22:36:53
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的整数次幂.



相关文章推荐

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

/* *copyright@nciaebupt 转载请保留此信息 *一个数组中有n个元素,其中只有一个只出现一次,其他恰好都出现两次, *怎样找出那个维一出现一次的元素。 *要求的复杂度:时间:O(n...

找出数组中只出现一次的2个数

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 思路整理一下: 首先交待一下异或的基本性质:2个...

一个数组中,除两个元素其余都出现了两次,找出这两个元素

 题目:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。     考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这...

一个数组有除了两个元素只出现一次,其他元素全部都出现了两次,请找出只出现一次的两个元素,并输出

#include #define N 10 int main()  { int a[N] = {1,2,7,99,3,3,4,1,2,4}, flat[N] = {0}; int i, j...

算法:数组找出2个只出现一次的数字(其他元素出现两次)

思路: 1、依然从头到尾异或所有的数字,这样得到的结果实际上就是两个只出现了一次的数字异或的结果, 2、在异或后的结果中找出其二进制中最右边为1的位,该位既然为1,说明异或的两个数字对应的该位肯定...

数据结构面试题总结5——数组:找出数组中唯一一个出现一次的元素

问题描述:一个数组其中有一个元素出现了一次(奇次),其他元素都出现两次(偶数次数),找出出现一次(奇次)的元素。 分析:碰到这种偶次奇次的问题,首先要想一下位运算中的异或。一个数异或本身为0,一个数...

hdu 3874 Necklace 求数组任意区间和(相同元素只算一次) 树状数组+离线算法

Problem DescriptionMery has a beautiful necklace. The necklace is made up of N magic balls. Each bal...

宝典练习1之在排序数组中找指定元素出现次数

分析题目: 首先想到的是遍历一遍数组,遇到相同元素就加1,遍历完之后就知道有多少个这样的元素,时间代价为o(n)! 但题目中有表示为排序数组,应该有更加简易的方法,容易想到的是二分查找,因为有序!...

程序员面试宝典(34)-找出数组中两个只出现一次的数字

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:首先我们考虑这个问题的一个简单版本:一个数组里除...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)