在一个成对数组中找出单独的数

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

这道题呢在leetcode上见过,那道题是从1连续到n,中间缺了一个数,让你找出来缺的那个数是什么。这两道题很相似,那道题就是用了疑惑,数组中的每个数和从1开始的i抑或,这样剩下来的也就是单独出现的i,也就是数组中缺少的那个元素。

讲真,我看到这道题的时候完全没有想到用异或,而且得知是两个不一样的元素的时候也不知道怎么样去用异或。所以所算法,对于一般人来讲,就是见过,用的熟练的问题,不求你会发明创造,只要用的好就可以了。

扯远了,回到这道题上。这道题有两个单独出现的元素。如果使用异或走一遍这个数组的话得到的结果是非0的,也就是这两个元素异或的结果。那么根据这个结果,怎么找出这两个元素呢。

思考一下,两个不一样的元素的异或的结果肯定不是0。那么我们就找这个结果中有右往左第一个非0位,也就是1出现的第一次的位置。这两个元素中肯定有一个在这个位置是0,另一个在这个位置是1。而其他成对出现的元素也会分为两个部分,一个部分在个位置是1,另一个部分在这个位置是0.所以,我们就把一个数组求两个单独元素的问题就分割成,两个数组每个数组求其单独元素的问题。所以这个时候使用异或就很好解决了。
代码如下:

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
       if(data.size() <2)return;
        int hxor =0;
        int flag =1;
        for(int i=0;i<data.size();++i)
            hxor ^= data[i];
        while((hxor&flag)==0) flag <<= 1;
        *num1 = hxor;
        *num2 = hxor;
        for(int i=0;i<data.size();++i)
            {
            if(data[i] & flag)
                *num1 ^= data[i];
            else
                *num2 ^= data[i];
        }
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,754评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 国庆假期,妈妈带我去青岛动物园玩!我高兴的不亦乐乎,前一天晚上,我折腾了好久才睡着。 我们走进动物园...
    祝福_e166阅读 318评论 0 2
  • 夜风习习,我站在阳台晾刚洗好的衣裳,一抬头发现一轮清浅的弯月,就那样斜斜的挂在边上,仿佛离我很近,伸出手去却又那么...
    如小玉阅读 632评论 0 0
  • 世人都晓神仙好,惟有功名忘不了!古今将相在何方?荒冢一堆草没了。 世人都晓神仙好,只有金银忘不了!终朝只恨聚无多,...
    向内的旅程阅读 312评论 0 2