【剑指offer】数组中只出现一次的数

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

分析:

经典的异或技巧题

两个相同的数字异或的结果为0,一个数和0异或的结果是其本身,假设现在那两个不同的数字是A和B,那么将整个数组的元素依次异或得到的结果ans就是A和B的异或结果

ans的二进制中第k位的1代表A的第k位和B的第k位不同,我们现在按照第k位是否相同将原数组分成两个子数组,那么必定A和B分别分散在两个子数组中,然后将子数组依次异或,得到的结果就是A和B的值!

至于k的取值则可以去第一个1即可

时间复杂度:O(N)

空间复杂度:O(1)

若采用map/set等其他辅助数据结构则需要额外的空间,性能也肯定没有异或法快!

复制代码
void FindNumsAppearOnce(vector<int> v,int *k1,int *k2)
{
    int n=v.size();
    if(n<2)
        return ;
    int ans=0;

    //得到k1和k2的异或结果
    for(int i=0; i<n; i++)
        ans^=v[i];

    //flag为将原数组分割成两个子数组的标志
    int flag=1;
    while((ans&flag)==0)
        flag<<=1;

    //0异或x还是等于x
    *k1=0;
    *k2=0;

    //将子数组逐个异或得到k1和k2的值
    for(int i=0; i<n; i++)
    {
        if((flag&v[i])==0)
            *k2^=v[i];
        else
            *k1^=v[i];
    }
}
复制代码
posted @   西*风  阅读(155)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示