zoukankan      html  css  js  c++  java
  • 面试题40:数组中只出现一次的数字

    题目:一个整形数组里除了两个数字之外,其他的数字都出现了两次。找出这两个只出现一次的数字。要求时间复杂度为O(N),空间复杂度为O(1)。

    分析:利用异或运算可以求出一个整形数组里唯一一个只出现一次的数字。因此,如果能将本题的数组分成两个部分,使得每个部分只包含一个只出现一次的数字,便可以求得本题的解。通过从头到尾依次异或数组中的每一个数字,最终得到的结果为两个只出现一次的数字异或得到的结果。由于这两个数字一定不同,因此其异或得到的结果中必定至少有一位为1。假设第n位为1,那么就可以根据第n位是否为1将原数组分成两个部分。

    vector<int> findNumsAppearOnce( vector<int>data )
    {
        vector<int>result;
        int n = data.size();
        if (n==0)
            return result;
        int temp = 0;
        for (int i = 0; i < n; ++i)
            temp^=data[i];
        //查找temp中第一个1出现的位置
        unsigned int k = 1;
        while ((temp&k)==0)
            k = k << 1;//关系运算符的优先级高于位运算符
        //利用k将data分为两个部分int result1 = 0, result2 = 0;
        for (int i = 0; i < n; ++i)
        {
            if ((data[i]&k) == 0)
                result1^=data[i];
            else
                result2^=data[i];
        }
        result.push_back(result1);
        result.push_back(result2);
            return result; 
    }
  • 相关阅读:
    jquery手写实现单页滚动导航
    小程序:商品分类,实现滑块视图
    微信小程序增加悬浮在线客服
    小程序 杂记
    自动售货机 扫描支付 原理
    HTTP的SSL 证书安装
    表达
    Linux 下svn恢复到某一版本
    倒车入库 技巧
    svn 杂记
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4624912.html
Copyright © 2011-2022 走看看