zoukankan      html  css  js  c++  java
  • 【剑指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];
        }
    }
  • 相关阅读:
    MSSQL—列记录合并
    MSSQL—字符串分离(Split函数)
    如何在ASP.NET Core中自定义Azure Storage File Provider
    从零开始实现ASP.NET Core MVC的插件式开发(六)
    对ASP.NET程序员非常有用的85个工具
    vs-code 配置
    idea-plugin
    VirtualBox中CentOS遇到的问题
    监听器
    线程组复杂场景
  • 原文地址:https://www.cnblogs.com/yinbiao/p/11577238.html
Copyright © 2011-2022 走看看