找出数组中出现仅一次的数字

有一个元素类型是整数的数组,数组中有一个数字仅仅出现了一次,其它都出现了两次,现在请把这个仅仅出现一个找出来。

分析:

1.1  首先想到的是排序,这样的时间复杂度是O(n*logn) + O(n),这样的速度的确不咋地;

1.2  最好的方法不是自己想出的,在网上找到的,是利用位运算的性质,两个相同的数字异或运算的结果是0,0和任何整数的异或运算是其本身,这两点足以,所以我们只需要遍历一边整个数组即可,时间复杂度是O(n)。

2 程序实现

#include <iostream>
using namespace std;
void main()
{
	int arr[] = {1,5,4,7,9,3,4,5,1,9,7};
	int nLength = sizeof(arr)/sizeof(arr[0]);
	int sum=0;
	for(int i=0;i<nLength;i++)
	{
		sum = sum ^ arr[i];
	}
	cout<<sum;
}
时间: 2024-10-18 04:24:12

找出数组中出现仅一次的数字的相关文章

40 - 找出数组中只出现一次的数字

题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.编写程序找出这个两个只出现一次的数字.要求时间复杂度O(n),空间复杂度O(1). 如 {2,4,3,6,3,2,5,5},输出{4,6} 解析: 空间复杂度为O(1)断绝了用hash-table的思路,时间复杂度O(n)断绝排序的思路. 如何判断一个数字出现2次呢? 计数 异或:如果出现2次,任意数字和自己异或都为0 异或的性质: 任何数字和 0 异或,都为它本身. 任意数字和自己异或都为0. 由于成对出现的元素异或结果为 0

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

题目 : 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 解析 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身.异或运算满足交换律结合律. 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了. 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组.我们首先还是先异或,剩下的数字肯定是A.B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位.我们就取第

面试题:找出数组中只出现一次的数字(二)

难度:中等 一个整数数组,除了一个数之外所有数字都出现了3次,找出这个数字来. 注意: 你的算法应该是线性运行复杂度,且不能使用额外内存空间. 答案: public class Solution { public int singleNumber(int[] nums) { int ones = 0, twos = 0, threes = 0; for (int i = 0; i < nums.length; i++) { // twos holds the num that appears t

面试题:找出数组中只出现一次的数字

难度:中等 一个整数数组,除了一个数之外所有数字都出现了2次,找出这个数字来. 注意: 你的算法应该是线性运行复杂度,且不能使用额外内存空间. 答案: public class Solution { public int singleNumber(int[] nums) { int n =0; // as we know that bitwise XOR in Java // 0 ^ N = N // N ^ N = 0 for(int i=0; i!=nums.length; i++) { n

经典算法学习——快速找出数组中两个数字,相加等于某特定值

这个算法题的描述如下:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值.目前我假设数组中的都是各不相等的整数.这道题是我在一次面试中被问到的,由于各种原因,我没回答上来,十分尴尬.其实这道题十分简单,我们使用相对巧妙的方法来实现下.注意不使用两层循环的元素遍历.示例代码上传至:https://github.com/chenyufeng1991/SumTo100 . 算法描述如下: (0)首先对原数组进行排序,成为递增数组: (1)对排序后的数组头部i [0]和数组尾部j [n-1]

442. 找出数组中重复的元素 Find All Duplicates in an ArrayGiven an array of integers

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,

找出数组中出现次数超过一半的元素

题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int half_number(int a[], int n) { if( a == NULL || n <= 0 ) return -1; int i, candidate; int times = 0; for( i=0; i<n; i++ ) { if( times == 0 ) { candidate

算法之找出数组中出现次数大于n/m的元素

最经典的题目莫过于是: 在一个数组中找出出现次数超过n/2的元素?更进一步的,找出数组中出现次数大于n/3的所有元素? 注:这里有一个很重要的事实,那就是出现次数大于n/m的元素的个数至多为(m-1)个,比如出现次数大于n/3的至多只有两个. 关于这一类题目的解题思路,可以先讲一个游戏 称作 "俄罗斯方块".这里的规则是每一行的元素要完全不一样,一样的元素则总是在同一列,如果最下面的行已经被填满,那么消除最下面的行. 例如在数组 A = {7,3,3,7,4,3,4,7,3,4,3,4

找出数组中唯一的重复元素

[问题] 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. 每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> /*根据异或法的计算方式,每两个相异的数执行异或运算之后,结果为1: 每两个相同的数异或之后,结果为0,任何数与0异或,结果仍为自身. 所以数组a[N]