一个整数列,除了一个数字重复2次,所有其他数字都重复4次。O(n)时间O(1)空间找到那个只出现2次的。

本文介绍了一种在O(n)时间内找到一个整数列中唯一出现两次的数字的算法,该算法仅使用O(1)空间复杂度,并通过位运算实现。示例代码和详细解释供读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个整数列,除了一个数字重复2次,所有其他数字都重复4次。O(n)时间O(1)空间找到那个只出现2次的。

e.g.

5, 6, 1123,5, 5, 6, 6, 7, 6, 7, 7, 1123, 5,7

 输出 1123;

 

#include <iostream>

 

using namespace std;

 

unsigned int foo(unsigned int a[], int n)

{

          unsignedint m[4] = {-1, 0, 0, 0}, mb;

          for(int i = 0; i < n; i++)

          {

                   mb= m[3];

                   m[3]= (m[3] & ~a[i]) | (m[2] & a[i]);

                   m[2]= (m[2] & ~a[i]) | (m[1] & a[i]);

                   m[1]= (m[1] & ~a[i]) | (m[0] & a[i]);

                   m[0]= (m[0] & ~a[i]) | (mb & a[i]);

          }

          returnm[2];

}

 

int main()

{

          unsignedint test[] = {5,1,2,5,2,2,2,1,1,1,3,3,3,3};

          unsignedint rt;

          rt= foo(test, 14);

          cout<< rt << endl;

          return0;

}

 

所有数字的二进制第0位统计,0有多少个,1有多少个,比如1的个数是除4余2的,则得知要找的那个数的二进制第0位为1。其他二进制位同样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值