【面试题40】数组中只出现一次的数字

【题目描述】

一个整型数组里除了两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。

【解决方案】

 1         public static void FindNumsAppearOnce(int[] data)
 2         {
 3             if (data == null || data.Length < 1)
 4                 throw new Exception("Arraty is empty!");
 5
 6             int numA = 0, numB = 0, numAll = 0;
 7
 8             foreach (int num in data)
 9                 numAll ^= num;
10
11             int bitOneFlag = GetBitOneFlag(numAll);
12
13             foreach (int num in data)
14             {
15                 if ((num & bitOneFlag) == 1)
16                     numA ^= num;
17                 else
18                     numB ^= num;
19             }
20
21             Console.WriteLine("numA:{0},numB:{1}", numA, numB);
22         }
23
24         public static int GetBitOneFlag(int num)
25         {
26             int count = 0;
27
28             while ((num & 1 << count) == 0)
29                 count++;
30
31             return 1 << count;
32         }
时间: 2024-10-10 17:12:28

【面试题40】数组中只出现一次的数字的相关文章

[剑指Offer]40.数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 我们直到异或的性质: 任何一个数字异或他自己都等于0. 所以说我们如果从头到尾依次异或每一个数字,那么最终的结果刚好只出现一次的数字,因为成对出现的两次的数字全部在异或中抵消了. 这道题中有两个数字只出现一次.这样的话我们得到的结果就是这两个数字的异或结果.因此我们想办法把原数组分成两个子数组,使得每个子数组包含一个只出现一次的数字.这样我们就可以对这两个子数组分别异或,就能得到两个只出现一

《剑指offer》:[40]数组中只出现一次的数字

题目:一个整型数组里除了两个数字外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(N),空间复杂度为O(1). 例如输入数组{2,4,3,6,3,2,5,5},因为只有4和6在这个数组里出现了一次,所以最后输出的是4,6. 分析:因为题目要求的时间复杂度和空间复杂度分别为:O(N)和O(1).所以这个题目不能借助辅助空间,那么也就是要在一次遍历后就能找出只出现一次的数据还是有一定的难度的.我在第一次看这个题目的时候也没想到什么好的办法.最后看了书上的提示才想到这

40.数组中只出现一次的数字

void FindNumsAppearOnce(int data[], int length, int* num1, int* num2) { if (data == NULL || length < 2) return; int resultExclusiveOR = 0; for (int i = 0; i < length; ++i) resultExclusiveOR ^= data[i]; unsigned int indexOf1 = FindFirstBitIs1(resultE

【01】数组中只出现一次的数字

其他两次,一个一次/其他三次,一个一次/其他两次,两个一次 ============================================ 任何一个数字异或他自己都得零. 注意异或运算的初始化变量为0,因为0异或任何数字都得那个数字自身. Single Number 1.一个整型数组中除了一个数字之外,其他数字都出现了两次 ,找出这个出现一次的数字. 解法一,异或是重复的消失,剩下的就是要找的数字. C++ Code 12345678910111213   int singleNumb

34.数组中只出现一次的数字

http://zhedahht.blog.163.com/blog/static/2541117420071128950682/ http://blog.csdn.net/maoxunxing/article/details/11386407 http://zhedahht.blog.163.com/blog/static/25411174201283084246412/ http://blog.csdn.net/wuzhekai1985/article/details/6704794 题目:一

数组中只出现一次的数字(剑指offer)思维有点巧

数组中只出现一次的数字 参与人数:1144时间限制:1秒空间限制:32768K 通过比例:21.75% 最佳记录:0 ms|0K(来自  牛客563536号) 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目链接:http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?rp=2&ru=/ta/coding-interviews&qru=/ta/coding

数组中只出现一次的数字-剑指Offer

数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 先考虑一个数组里只有一个数出现一次,其他两个数都出现两次的情况:一个数跟自己异或后为0,一个数组里只有一个数出现一次其他两次,挨个异或后最后得到的结果就是只出现一次的那个数. 我们把这个数组分为两部分,每部分只有一个数只出现一次:我们分的时候,把所有数都异或后,得到的结果肯定不为0,其实是那两个只出现一次的不同的数的异或,我们从低位到高危找到第一个不为0的那位,异

编程算法 - 数组中只出现一次的数字 代码(C)

数组中只出现一次的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字. 如果从头到尾依次异或数组中的每一个数字, 那么最终的结果刚好是那个只出现一次的数字. 根据结果数组二进制某一位为1, 以此分组, 为1的一组, 为0的一组, 再重新进行异或. 最后得出两个结果. 时间复杂度O(n). 代码: /* * main.cpp * * Create

剑指offer系列源码-数组中只出现一次的数字

题目1351:数组中只出现一次的数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2582解决:758 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3 2 5 5

【剑指offer】数组中只出现一次的数字(1)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3