zoukankan      html  css  js  c++  java
  • LintCode Single Number III

    Given 2*n + 2 numbers, every numbers occurs twice except two, find them.
    Have you met this question in a real interview? Yes
    Example
    Given [1,2,2,3,4,4,5,3] return 1 and 5
    Challenge
    O(n) time, O(1) extra space.

    class Solution {
    public:
        /**
         * @param A : An integer array
         * @return : Two integers
         */
        vector<int> singleNumberIII(vector<int> &A) {
            // write your code here
            int xors = 0;
            for (int e : A) {
                xors ^= e;
            }
    
            int a = 0, b = 0;
    
            int offset = 31;
            while (offset >= 0 && ((xors >> offset) & 0x1) == 0) {
                offset--;
            }
    
            for (int e : A) {
                if (0x1 & (e>>offset)) {
                    a ^= e;
                } else {
                    b ^= e;
                }
            }
    
            return {a, b};
        }
    };
    
    

    首先进行一次全部数据的xor,这样的结果就是两个只出现一次的数的xor结果,由于两个数必然是不同的,所以他们xor结果上的某一个位必然是1,依据这个特征再将数分成两组,分别求出各自组内的xor,结果就是只出现一次的数。分组也可以按如下进行

            int mask = xors ^ (xors & (xors - 1));
    
            for (int e : A) {
                if (e & mask) {
                    a ^= e;
                } else {
                    b ^= e;
                }
            }
    
  • 相关阅读:
    听说-- 迭代
    听说
    听说---时序图
    闪屏
    WBS
    听说
    Agile Development ----敏捷开发
    软件测试
    需求分析:WBS图
    2048小游戏
  • 原文地址:https://www.cnblogs.com/lailailai/p/4816736.html
Copyright © 2011-2022 走看看