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;
        }
  • 相关阅读:
    学习shell script
    ubuntu11.10安装出现/cdrom问题以及不能格式成ext问题
    正则表达式
    认识与学习bash(2)
    UNIX网络编程 一个简单的时间获取客户程序
    HDU4522
    恢复引导
    认识与学习bash(1)
    文件格式化处理
    C++解析csv文件
  • 原文地址:https://www.cnblogs.com/dplearning/p/4672954.html
Copyright © 2011-2022 走看看