一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。
来源:互联网 发布:一之濑琴美 知乎 编辑:程序博客网 时间:2024/04/30 12:14
要求时间复杂度是O(n),空间复杂度是O(1)。
思路:
1.通过异或运算,可以消除两个相同的数: A ^ A = 02.若一组数中仅有一个数字出现一次,其它数字均出现两次,将这组数字逐个做异或运算,结果就是仅出现一次的数字。
3.数组中有两个仅出现一次的数字,其它数字均出现两次,所以最终异或结果即为这两个数异或的结果。4.这个结果中右起第一个不为1的位(第n位)表示这两个数的该位不一致,一个为0一个为1
5.现在要设法把这两个数分到不同的两个组里,同时保证组内其它数字均出现两次
6.按照第n位为0或1进行分组,这样可以保证这两个数可以分在不同的组,同时也保证相同的两个数分在同一个组。
7.这样就转化为2.所述问题,得解。
参考代码(转载)
#include <stdio.h>int main() {int a[] = {1, 2, 0, 2, 1, 9, 3, 9, 0, -1};int number1 = 0, number2 = 0;int i = 1, tmp = a[0], index = 0;for (; i < sizeof(a)/sizeof(*a); ++i) { //得出 3 ^ -1tmp ^= a[i];}number1 = tmp; number2 = tmp; // number1 = 0;// number2 = 0;// number1 = tmp; number2 = tmp; 时,number累积异或的结果为出现在另一组的那个数// number1 = 0; number2 = 0; 时,number累积异或的结果为出现在本组的那个数while (tmp) { //找出tmp从右数第一个为1的位置if (1== (tmp & 1)) {break;}++index;tmp >>= 1;}for (i = 0; i < sizeof(a)/sizeof(a[0]); ++i) { //以index位为1将数组分成两部分,每部分只含有一个只出现一次的数字if (1 == ((a[i] >> index) & 1)) { //得到一个number1 ^= a[i]; }else { //得到另外一个number2 ^= a[i];}}printf("%d %dn", number1, number2);return 0;}
原创文章,转载请注明: 转载自 编程小径
本文链接地址: http://blog.csdn.net/imbing/article/details/8217289
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个出现一次的数字
- 一个整型数组里除了两个数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个不同数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n), 空间复杂度是O(1)
- 算法习题61:找出数组中两个只出现一次的数字:一个整型数组里除了两个数字之外,其他的数字都出现了两次
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。查出其他两个只出现一次的数
- 浏览器是怎么工作的(前端必读)
- C++面向对象总结
- android install INSTALL_FAILED_MISSING_SHARED_LIBRARY
- Linux 下的压缩和打包命令
- Oracle11g如何修改最大连接数
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。
- 单选框状态的判断,当你做选择题时,没选择任何答案不让做下一道题,就会遇到这种问题了!
- QCon所见和所得:杭州QCon热门技术话题分享
- WinRunner的工作流程
- i2c驱动的编写
- 排序算法之计数排序
- ruby的数组操作
- java经典算法_002判断素数
- (转)8款在线CSS优化工具/组织和压缩CSS