zoukankan      html  css  js  c++  java
  • 【剑指offer】数组中只出现一次的数字

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

    思路:

    自己对知识使用的灵活性不够...

    如果只有一个只出现一次的数字直接异或就可以了,但两个怎么办呢?

    后来看得答案:先异或一遍最后的数字是这两个不一样的数字异或的结果。那么这个异或数字为1的位一定是这两个数字不同的位。我们找到一个不同位做标准,把数字分成两组,这样两个只出现一次的数字就分开了。

    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) 
        {
            if(data.size() < 2)
                return;
    
            int n1 = 0, n2 = 0;
            int myxor = 0;
            int firstOne = 1;
            for(int i = 0; i < data.size(); i++) //所有数字异或 消去相同数字
                myxor ^= data[i];
            
            while((myxor & firstOne) == 0) //从最低位开始,找到一个myxor中是1的位
                firstOne = firstOne << 1;
    
            for(int i = 0; i < data.size(); i++) //根据找到的那一位是否为1把原数组分为两个,把两个数字分别找到
            {
                if((data[i] & firstOne) == 0)
                    n1 ^= data[i];
                else
                    n2 ^= data[i];
            }
    
            *num1 = n1;
            *num2 = n2;
        }
  • 相关阅读:
    devm_xxx机制
    shell中的IFS和$*变量
    数轮中结论记录,超大指数取模
    ZOJ 3537 Cake 求凸包 区间DP
    数据库 外键
    python 学习笔记 sqlalchemy
    python 学记笔记 SQLalchemy
    malloc 函数详解
    动态字典树
    枚举子集的写法
  • 原文地址:https://www.cnblogs.com/dplearning/p/4672954.html
Copyright © 2011-2022 走看看