Single Number III leetcode java
问题描述:
Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
- The order of the result is not important. So in the above example,
[5, 3]
is also correct. - Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
提示:bit manipulation
一、位运算
//参照single number 的方法,将所有数异或运算,得到result为两个single number的异或;
//找到result中最低位为1的那一位,是两个single number不同的地方,根据这个bit,可以将nums数组中的数分为A、B两组;
//然后分别在A和B中寻找single number即可
public static int[] singleNumber_Bit(int[] nums){ int result = 0; for(int i = 0; i < nums.length; i++){ result = result ^ nums[i]; } int[] res = new int[2]; //找到result二进制表示中最右侧的1 int pos = result & ( ~ (result - 1 )); //统计一个int型整数的二进制表示中有多少个1,可以采用 n = n & (n - 1);来从右到左逐个统计1的个数 for(int i = 0 ; i < nums.length; i++){ //将nums分为A B两组来分别求single number if((pos & nums[i]) != 0){ res[0] = res[0] ^ nums[i]; } else { res[1] = res[1] ^ nums[i]; } } return res; }