数组中只出现一次的数字
来源:互联网 发布:七骑士亚服充值淘宝 编辑:程序博客网 时间:2024/05/18 14:12
问题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度为O(1).
算法思想:采取异或操作和根据结果二进制中1的位置进行划分为两个部分,然后在采取异或运算得出不同的结果。
unsigned int FindFirstBitIs1(int num);bool IsBit1(int num, unsigned int indexBit);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(resultExclusiveOR); *num1 = *num2 = 0; for (int j = 0; j < length; ++ j) { if(IsBit1(data[j], indexOf1)) *num1 ^= data[j]; else *num2 ^= data[j]; }} // 找到num从右边数起第一个是1的位unsigned int FindFirstBitIs1(int num){ int indexBit = 0; while (((num & 1) == 0) && (indexBit < 8 * sizeof(int))) { num = num >> 1; ++ indexBit; } return indexBit;}// 判断数字num的第indexBit位是不是1bool IsBit1(int num, unsigned int indexBit){ num = num >> indexBit; return (num & 1);}// ====================测试代码====================void Test(char* testName, int data[], int length, int expected1, int expected2){ if(testName != NULL) printf("%s begins: ", testName); int result1, result2; FindNumsAppearOnce(data, length, &result1, &result2); if((expected1 == result1 && expected2 == result2) || (expected2 == result1 && expected1 == result2)) printf("Passed.\n\n"); else printf("Failed.\n\n");}void Test1(){ int data[] = {2, 4, 3, 6, 3, 2, 5, 5}; Test("Test1", data, sizeof(data) / sizeof(int), 4, 6);}void Test2(){ int data[] = {4, 6}; Test("Test2", data, sizeof(data) / sizeof(int), 4, 6);}void Test3(){ int data[] = {4, 6, 1, 1, 1, 1}; Test("Test3", data, sizeof(data) / sizeof(int), 4, 6);}int _tmain(int argc, _TCHAR* argv[]){ Test1(); Test2(); Test3(); return 0;}
0 0
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- html之插入图片
- 多功能监护系统开发与设计
- zookeeper 分布式带来的不同开发设计点
- Android测试手机记录报错日志
- 欢迎使用CSDN-markdown编辑器
- 数组中只出现一次的数字
- 动画原理
- Pow(x, n)
- 欢迎使用CSDN-markdown编辑器
- 消除a标签的默认点击后虚线框的样式
- 【转自知乎】5G关键技术之波束成形
- /system/bin/service分析与使用
- [Ubertooth-general] sniff and decrypt/crack bluetooth 2.0
- 欢迎使用CSDN-markdown编辑器