法一(位运算)
/**
* 法一(位运算)
* (1)基本运算
* 0 ^ x = x
* x ^ x = 0
* x & ~x = 0
* x & ~0 = x
* (2)例子:nums = [2,2,2,3]
* 2第一次出现,a = 2, b = 0
* 2第二次出现,a = 0, b = 2
* 2第三次出现,a = 0, b = 0,a和b变为初始状态0
* 3只出现一次,a = 3, b = 0,返回a
* (3)由于位运算满足交换律,因此最终结果和运算顺序没关系,出现三次的都被抵消了
*
* @param nums
* @return
*/
public int singleNumber(int[] nums) {
int a = 0, b = 0; // 一开始a和b都为0
for (int num : nums) {
a = (a ^ num) & ~b;
b = (b ^ num) & ~a;
}
return a;
}
本地测试
/**
* 137. 只出现一次的数字 II
*/
lay.showTitle(137);
Solution137 sol137 = new Solution137();
int[] nums137 = new int[]{2, 2, 3, 2};
System.out.println(Arrays.toString(nums137));
System.out.println(sol137.singleNumber(nums137));