[LintCode] 落单的数 III Single Number III

来源:互联网 发布:电子商务域名 编辑:程序博客网 时间:2024/06/05 11:30

给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
样例
给出 [1,2,2,3,4,4,5,3],返回 1和5
挑战
O(n)时间复杂度,O(1)的额外空间复杂度

Given 2*n + 2 numbers, every numbers occurs twice except two, find them.
Example
Given [1,2,2,3,4,4,5,3] return 1 and 5

Challenge
O(n) time, O(1) extra space.

思路:将全部的数异或,最后得到一个数,此数为两个出现一次的数的异或。得到的这个数至少有一位为1,此位可将所有数分为两部分,一部分此位为0,另一部分此位为1,所求的两个数一定分别在两部分中,并且每一部分的个数都是2*m+1,问题就转化为两部分分别求落单的数I,即可两部分分别异或求出两数。

public class Solution {    /**     * @param A : An integer array     * @return : Two integers     */    public List<Integer> singleNumberIII(int[] A) {        if(null == A || A.length ==0) return null;        List<Integer> list = new ArrayList<Integer>();        int x = 0;        for(int i = 0; i < A.length; i++) {            x ^= A[i];        }        int k = 0;        while((x % 2) == 0 && k < 32){            k++;            x>>=1;        }        int result1 = 0, result2 = 0;        for(int i = 0; i < A.length; i++) {            if(((A[i]>>>k) & 1) == 0) {                result1 ^= A[i];            }else {                result2 ^= A[i];            }        }        list.add(result1);        list.add(result2);        return list;    }}
0 0
原创粉丝点击