[leetcode/lintcode 题解] 微软面试题:不重复的两个数

241 阅读1分钟

给定一个数组 a[],其中除了2个数,别的数都出现了2次,找到不重复的2个数并返回。

在线评测地址:LintCode领扣

Example 1:
Input: a =[1,2,5,5,6,6]
Output: [1,2]
Explanation:
In addition to the 1 and 2 other numbers appear twice, so return [1, 2]
Example 2:
Input: a=[3,2,7,5,5,7]
Output:[2,3]
Explanation:
In addition to the 2 and 3 other numbers appear twice, so return [2, 3]

【题解】

从头到尾依次异或数组中的每一个数字,得到两个只出现一次的数字的异或结果,在结果数字中找到第一个为1的位的位置,记为第N位,以第N位是不是1为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第N位都为1,而第二个子数组的每个数字的第N位都为0。

public class Solution {
    
    /**
     * @param a: the array
     * @return: the two numbers that are not repeated
     */
    public List<Integer> theTwoNumbers(List<Integer> a) {
        // Write your code here
    	int length = a.size();
    	List<Integer> res = new ArrayList<Integer>();
    	if(length < 2) {
    		return res;
    	}
    	
    	// get num1 ^ num2
    	int resultExclusiveOR = 0;
    	for(int i = 0; i < length; ++i) {
    		resultExclusiveOR ^= a.get(i);
    	}
    	
    	// get index of the first bit, which is 1 in resultExclusiveOR
    	int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
    	
    	int num1 = 0, num2 = 0;
    	for(int j = 0; j < length; ++j) {
    		// divide the numbers in data into two groups,
            // the indexOf1 bit of numbers in the first group is 1,
            // while in the second group is 0
            if(IsBit1(a.get(j), indexOf1)) {
                  num1 ^= a.get(j);
            }
            else {
                  num2 ^= a.get(j);
            }
    	}
    	res.add(num1);
    	res.add(num2);
    	return res;
    }
    
	// Find the index of first bit which is 1 in num (assuming not 0)
    private int FindFirstBitIs1(int num) {
        int indexBit = 0;
        while (((num & 1) == 0) && (indexBit < 32)) {
            num = num >> 1;
            ++ indexBit;
        }
        return indexBit;
    }
    
    // Is the indexBit bit of num 1?
    private boolean IsBit1(int num, int indexBit) {
        num = num >> indexBit;
        return (num & 1) == 0 ? false : true;
    }
}

更多语言代码参见:leetcode/lintcode题解