笔试题-查找唯一相同的整数3道
2015-01-13 21:51
183 查看
1 数组中数字都两两相同,只有一个不同,找出该数字
2 数组中数字两两相同,有两个不同,找出这两个
一问题描述
一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字。
二 问题分析
此题实际考察了,对位操作的理解。首先进行简化,考虑只有一个数组中,只存在出现了一次的一个数字,其余数字在数组中出现两次,试找出这个数字。
三 解决方案
首先 回忆 异或操作,任意数字与自身相异或,结果都为0.
还有一个重要的性质,即任何元素与0相异或,结果都为元素自身。
解决方案:
1 从数组的起始位置开始,对元素执行异或操作,则最后的结果,即为此只出现了一次的元素。
2 题目中,数组中存在两个不同的元素,若是能仿造上述的解决方案,将两个元素分别放置在两个数组中,然后分别对每个数组进行异或操作,则所求异或结果即为所求。
3 首先对原数组进行全部元素的异或,得到一个必然不为0的结果,然后判断该结果的2进制数字中,为1的最低的一位。然后根据此位是否为1 ,可以把原数组分为两组。则两个不同的元素,必然分别在这两个数组中。
4 然后对两个数组,进行异或操作,即可得到所求。
3 题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,只有1,5,6这三个数字是唯一出现的,我们只需要输出1,5,6中的一个就行。
#include <iostream> using namespace std; int findUnique(int* a, int len); int findUnique2(int* a, int len); void main() { int a[] = {1,2,5,3,3,2,1}; int b = findUnique(a,7); cout<<b<<endl; } //写法一 int findUnique(int* a, int len) { int temp = a[0]; for (int i = 1; i < len; i++) { temp ^= a[i]; } return temp; } //写法二: int findUnique2(int* a, int len) { int temp; int index = -1; bool b; int i,j; for (i = 0; i < len; i++) { b = false; temp = a[i]; for (j = 0; j < len; j++) { if (j != i && temp == a[j]) { b = true; break; } } if (b == false) { index = i; return a[index]; } } return -1; }
2 数组中数字两两相同,有两个不同,找出这两个
一问题描述
一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字。
二 问题分析
此题实际考察了,对位操作的理解。首先进行简化,考虑只有一个数组中,只存在出现了一次的一个数字,其余数字在数组中出现两次,试找出这个数字。
三 解决方案
首先 回忆 异或操作,任意数字与自身相异或,结果都为0.
还有一个重要的性质,即任何元素与0相异或,结果都为元素自身。
解决方案:
1 从数组的起始位置开始,对元素执行异或操作,则最后的结果,即为此只出现了一次的元素。
2 题目中,数组中存在两个不同的元素,若是能仿造上述的解决方案,将两个元素分别放置在两个数组中,然后分别对每个数组进行异或操作,则所求异或结果即为所求。
3 首先对原数组进行全部元素的异或,得到一个必然不为0的结果,然后判断该结果的2进制数字中,为1的最低的一位。然后根据此位是否为1 ,可以把原数组分为两组。则两个不同的元素,必然分别在这两个数组中。
4 然后对两个数组,进行异或操作,即可得到所求。
#include <iostream> using namespace std; int findUnique(int* a, int len); void findTwo(int* a, int& one, int& two, int sum,int len); void main() { int a[10] = {3, 5, 8, 8 ,5, 3, 1, 4, 4, 10}; int sum = findUnique(a,7); int one; int two; findTwo(a,one,two,sum,10); cout<<one<<endl; cout<<two<<endl; } int findUnique(int* a, int len) { int temp = a[0]; for (int i = 1; i < len; i++) { temp ^= a[i]; } return temp; } void findTwo(int* a, int& one, int& two, int sum, int len) { unsigned int flag = 1; while (flag) { if (flag & 1) { break; } flag <<= 1; } one = two = 0; for (int i = 0; i < len; i++) { if (a[i] & flag) { one ^= a[i]; } else { two ^= a[i]; } } }
3 题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,只有1,5,6这三个数字是唯一出现的,我们只需要输出1,5,6中的一个就行。
#include <iostream> using namespace std; int findUnique(int* a, int len); int findOnly(int* a, int sum, int len); void main() { int a[7] = {1,2,4,5,6,4,2}; int sum = findUnique(a,7); int num = findOnly(a,sum,7); cout<<num<<endl; } int findUnique(int* a, int len) { int temp = a[0]; for (int i = 1; i < len; i++) { temp ^= a[i]; } return temp; } int findOnly(int* a, int sum, int len) { unsigned int flag = 1; while (flag) { if (flag & 1) { break; } flag <<= 1; } int one,two,countOne,countTwo; one = two = countOne = countTwo = 0; for (int i = 0; i < len; i++) { if (a[i] & flag) { one ^= a[i]; countOne++; } else { two ^= a[i]; countTwo++; } } if (countOne & 1) { return one; } else { return two; } }
相关文章推荐
- 多个相同classname的控件中查找子控件(父控件text、resource-id为空,classname不是唯一...)
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数。
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数
- *(5)输入互不相同的一组整数,构造一棵二叉排序树,要求: ① 按递减有序的顺序输出; ② 输入一个整数,查找该整数是否在该二叉排序树中,查找成功返回1,否则返回0; ③ 在②中,若查找成功,则将该结
- 两个有n个数的整数数组,都排好序了。 用O(n)的时间查找两个数组是否有相同的数字。
- 查找最小的k个元素(笔试题) 输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4
- Hash(篇1)实现一个函数来查找具有相同唯一字符集的所有单词
- 名企笔试:2013 Facebook招聘笔试(查找相同url)
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数
- 阿里巴巴2013最新笔试题(查找树中相同节点对)
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数。
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数。
- 将一个整数拆分成不相同的正整数之和,打印出所有的组合
- BASIC-5 查找整数
- shell脚本查找两个文件夹下相同的文件名
- 字符串匹配算法(在字符串T中查找是否有与字符串P相同的子串)
- 43亿整数中查找至少出现2次整数
- 判断整数序列是不二元查找树的后遍历结果
- 蓝桥杯练习系统——查找整数
- IGT笔试题,正整数N等于M个不同的正整数之和的问题