一、题目
1、审题
2、分析
在线性时间复杂度、常量空间开销的情况下统计出一个整形数组中只出现一次的两个数(其他的数都是出现2次)。
二、解答
1、思路
①、对数组所有元素进行异或(^) 操作,得到只出现 1 次的这两个数的异或结果 diff。
②、diff &= -diff ,得到只出现一次的两个数的二进制形式的第一个不同的位置 a。
③、初始化结果数组{0, 0},遍历数组中的元素,若 a = 1,则与结果数组中第一个元素进行异或;若 a = 0 ,则与第二个元素进行异或。
④、返回结果数组。
public int[] singleNumber(int[] nums) { // Pass 1 : // Get the XOR of the two numbers we need to find int diff = 0; for(int num: nums) diff ^= num; // Get its last set bit diff &= -diff; // Pass 2 : int[] rets = {0, 0}; for(int num: nums) { if((num & diff) == 0) rets[0] ^= num; else rets[1] ^= num; } return rets; }