第六十一题(找出数组中两个只出现一次的数字)
2014-07-04 18:00
363 查看
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
思路:先对所有数据进行异或得到结果result,两两相同的数据异或结果为0,因此result为两个只出现1次的数字异或的结果,求得result左边第一个值为1的位,根据异或的性质可知,这两个只出现一次的数字该位上的值肯定不同,一个为0,一个为1,以此为标准,对整个数组中的该位为1的数字进行异或,相同的数字两两消去,得到的结果为该位为1的只出现了一次的数字,同理求得另一个数字。
C++代码:
运行结果:
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
思路:先对所有数据进行异或得到结果result,两两相同的数据异或结果为0,因此result为两个只出现1次的数字异或的结果,求得result左边第一个值为1的位,根据异或的性质可知,这两个只出现一次的数字该位上的值肯定不同,一个为0,一个为1,以此为标准,对整个数组中的该位为1的数字进行异或,相同的数字两两消去,得到的结果为该位为1的只出现了一次的数字,同理求得另一个数字。
C++代码:
#include "stdafx.h" #include<iostream> namespace MS100P_61 { void findTwoSingle(int data[],int length) { int result=0; for (int i = 0; i < length; i++) result = result^data[i]; int bitIndex; for (bitIndex = 0; bitIndex < 8 * sizeof(int); bitIndex++) { if (result&(1 << bitIndex)) break; } result = 0; for (int i = 0; i < length;i++) if (data[i] & (1 << bitIndex)) result = result^data[i]; cout << "one number is:" << result << endl; result = 0; for (int i = 0; i < length; i++) if (!(data[i] & (1 << bitIndex))) result = result^data[i]; cout << "the other is:" << result << endl; } void test() { int A[] = {3,3,2,2,12,12,7,-1}; findTwoSingle(A, 8); } } int _tmain(int argc, _TCHAR* argv[]) { MS100P_61::test(); return 0; }
运行结果:
相关文章推荐
- 找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】
- 第六十一题(找出数组中两个仅仅出现一次的数字)
- 找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 程序员面试题精选100题(34)-找出数组中两个只出现一次的数字
- [数组]找出数组中两个只出现一次的数字
- 每天一道算法题10 找出数组中两个只出现一次的数字
- 解题笔记(24)——找出数组中两个只出现一次的数字(数组)
- 【转帖】找出数组中两个只出现一次的数字
- 100题_34 找出数组中两个只出现一次的数字
- 算法题6 找出整数数组中两个只出现一次的数字
- 程序员面试100题之三十四,找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中唯一出现一次的两个数字
- 【每日面试题】找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 面试题_找出数组中两个只出现一次的数字
- 【算法14】找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字--分组异或