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

转载 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的整数次幂.



第一个仅出现一次的数组元素

给定一个整型数组,请写一个算法,找到第一个仅出现一次的数组元素,复杂度为O(n)输入样例: 1,1,2,2,3,3,4,4,5,6,6,8,9,9 输出: 5 可以使用dictionary来做...
  • liguagua2012
  • liguagua2012
  • 2017年04月12日 16:26
  • 78

数组中除一个元素外其他所有元素出现二或三次,找到只出现一次的元素

1、数组中除一个元素外其他所有元素出现二,找到只出现一次的那个元素。public int singleNumber(int[] nums) { int res = nums[0]; ...
  • guoyuguang0
  • guoyuguang0
  • 2016年04月01日 10:13
  • 1815

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

 题目:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。     考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这...
  • NicolasYan
  • NicolasYan
  • 2014年12月09日 01:02
  • 1409

一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?

#include int a[] = {433,657,9876,42,9876,657,42,433,433,657,42}; int find_twice(int a[], int ...
  • erazy0
  • erazy0
  • 2011年05月24日 23:36
  • 3879

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

对于一个数组其中每个数出现了两次,只有一个数出现了一次,找出这个只出现了一次的一个数,这是一个经典的面试题,把数组中的数进行异或运算,出现两次的数异或的结果为0,最终异或的结果就为只出现了一次的一个数...
  • xhp1564881
  • xhp1564881
  • 2016年04月06日 10:04
  • 1697

找数组中只出现一次的元素--位运算

题1:99个数,里面只有一个数出现了一次,其他均出现了两次;如何最快找到这个数,假设为一个int数组里,数大小没有限制特点:数值范围不确定;仅有一个数单词出现;// 运用位操作,异或所有元素; #in...
  • Tina224243
  • Tina224243
  • 2016年08月02日 11:47
  • 460

java,查找数组中指定元素第一次出现的索引值。

/* * 查找数组中指定元素第一次出现的索引值。 int[] arr = {98,23,16,35,72}; 查找23在数组中的索引值。 */ public class ShuZu {...
  • ayzc210
  • ayzc210
  • 2015年09月02日 15:10
  • 4587

java 找出数组中只出现一次的数字

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 算法如下:import java.util.HashMap; import java.util.It...
  • diu_brother
  • diu_brother
  • 2016年04月01日 21:00
  • 1568

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

Given an array of integers, every element appears twice except for one. Find that single one.  Note...
  • ling913
  • ling913
  • 2014年11月13日 22:36
  • 1114

查找有序数组中某个数首次出现的位置

int find(int *a, int len, int key) { if (a == NULL || len < 1) return - 1; int low =...
  • jfkidear
  • jfkidear
  • 2016年10月21日 18:44
  • 569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:找数组中只出现一次的元素
举报原因:
原因补充:

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