找出数组中两个只出现一次的数字
程序员文章站
2022-07-15 12:05:04
...
1,题意:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
2,分析:
(1)各个元素依次异或,得到两个数字异或的结果 val.
(2)找到val的一个bit为1的位.
(3)根据上述比特位1或0将原来的数组分成两组.
(4)每组异或,即可得到要求的数.
3,实例代码:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
2,分析:
(1)各个元素依次异或,得到两个数字异或的结果 val.
(2)找到val的一个bit为1的位.
(3)根据上述比特位1或0将原来的数组分成两组.
(4)每组异或,即可得到要求的数.
3,实例代码:
#include <iostream>
#include <cstring>
using namespace std;
void findOnce(int data[], int n, int &num1, int &num2)
{
if (n < 5)
return;
int r1 = 0;
for (int i = 0; i < n; i++)
r1 ^= data[i];
int bitNum = 0;
while ( !(r1 & 0x1))
{
r1 >>= 1;
++bitNum;
}
int flag = (1 << bitNum);
num1 = 0;
num2 = 0;
for (int i = 0; i < n; i++)
{
if ( data[i] & flag)
num1 ^= data[i];
else
num2 ^= data[i];
}
}
int main()
{
int data[] = {1,1,2,3,3,4,5,5};
int num1, num2;
findOnce(data, sizeof(data)/sizeof(data[0]), num1, num2);
cout << num1 <<" " << num2 << endl;
return 0;
}
上一篇: java.lang.IllegalStateException: Neither BindingResult nor plain target object f
下一篇: java.lang.IllegalStateException: Cannot forward after response has been committed
推荐阅读
-
剑指offer28:找出数组中超过一半的数字。
-
PHP查找数组中只出现一次的数字实现方法【查找特定元素】
-
PHP实现找出数组中出现次数超过数组长度一半的数字算法示例
-
在字符串中找出第一个只出现一次的字符。经典C语言例题
-
leadcode的Hot100系列--136. 只出现一次的数字
-
python(leetcode)-136只出现一次的数字
-
LeetCode 面试题56 - I. 数组中数字出现的次数
-
在一个非降序排列的数组中,找出数字target出现的次数问题解答
-
剑指offer 56 数组中数字出现的次数 lintcode 82. 落单的数、83. 落单的数 II、84. 落单的数 III
-
LeetCode 1 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。