美文网首页
在一个成对数组中找出单独的数

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

作者: 单倍体 | 来源:发表于2017-08-18 00:24 被阅读0次

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

这道题呢在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];
        }
    }
};

相关文章

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

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

  • 找出数组中唯一不同的数

    一个数组中只有一个数是唯一的,其他数都是成对出现,找出这个唯一的数 要求时间复杂度为o(n),空间复杂度为o(1)...

  • Lua 快速排序

    快排 在一个数组中快速找出第K大的数

  • 带重复元素的二分搜索

    给定排好序的数组和一个数,从数组中找出最早出现该数的下标。

  • 找出数组中单独出现的3个数

    题目:一个整型数组里除了3个数字之外,其他的数字都出现了两次。请写程序找出这3个只出现一次的数字。要求时间复杂度是...

  • 《剑指Offer》之数据结构篇

    1. 长度为n数组,数字在 0~n-1 范围内,找出数组中任意一个重复的数 O(n) 2. 不修改数组找出重复数字...

  • 2018-05-30 496. Next Greater Ele

    题意:给你两个数组,找出数组一中所有的元素,在第二个数组中对应位置右边第一个比该数大的数。 第一个数组中元素“4”...

  • 算法题:搜索两条单身狗

    技术群里有人提出一个算法题:一个Int型数组,里面的每一个数都是成双成对的,只有一个数是单身狗,找出这个数,算法复...

  • 计蒜客 第二十题 最大子阵列

    在一个数组中找出和最大的连续几个数。(至少包含一个数) 例如: 数组A[] = [−2, 1, −3, 4, −1...

  • 动态求子列的最大和

    在一个数组中找出和最大的连续几个数。(至少包含一个数) 例如: 数组A[] = [−2, 1, −3, 4, −1...

网友评论

      本文标题:在一个成对数组中找出单独的数

      本文链接:https://www.haomeiwen.com/subject/vilorxtx.html