zoukankan      html  css  js  c++  java
  • [面试] 找出数组中两个只出现一次的数字找出这两个只出现一次的数字

    三 解决方案
        首先 回忆 异或操作,任意数字与自身相异或,结果都为0.
       还有一个重要的性质,即任何元素与0相异或,结果都为元素自身。
       
       解决方案:
      1   从数组的起始位置开始,对元素执行异或操作,则最后的结果,即为此只出现了一次的元素。
     
      2  题目中,数组中存在两个不同的元素,若是能仿造上述的解决方案,将两个元素分别放置在两个数组中,然后分别对每个数组进行异或操作,
         则所求异或结果即为所求。
      
      3  首先对原数组进行全部元素的异或,得到一个必然不为0的结果,然后判断该结果的2进制数字中,为1的最低的一位。
          然后根据此位是否为1 ,可以把原数组分为两组。则两个不同的元素,必然分别在这两个数组中。
      4  然后对两个数组,进行异或操作,即可得到所求。
    
    四 代码示例
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    const int N = 10;
    
    int getSingle(int *a) { //获取全部元素的异或结果 
        if(!a) { //  
            return -1;
        }
        int sum = a[0];
        for(int i = 1; i < N; i++) {
            sum ^= a[i];
        }
        return sum;
    }
    void getTwo(int *a, int &one, int &two, int sum) {
        unsigned int flag = 1;
        while(1) {
            if(flag&sum)
                break;
            flag = flag << 1;
        }
        one = 0;
        two = 0;
        for(int i = 0; i < N; i++) {
            if(a[i]&flag) {
                one ^= a[i];
            }
            else {
                two ^= a[i];
            }
        }
        cout << sum << ' ' << one << ' ' << two << endl;
    }   
    int main() {
        int a[N] = {3, 5, 8, 8, 5, 3, 1, 4, 4, 10}; 
        int single = getSingle(a);
        int one = 0;
        int two = 0;
        getTwo(a, one, two, single);
        system("pause");
        return 0;
    }

  • 相关阅读:
    Android 高仿微信支付密码输入控件
    ListView用法总结
    我的感悟
    Android Scroll分析——滑动效果产生
    如何查看Android的Keystore文件的SHA1值
    Android 事件拦截机制一种粗鄙的解释
    Android 自定义ViewGroup
    Android 自定义View 总结
    Android 自定义View 三板斧之三——重写View来实现全新控件
    Android 自定义View 三板斧之二——组合现有控件
  • 原文地址:https://www.cnblogs.com/robbychan/p/3787156.html
Copyright © 2011-2022 走看看