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?
题目大意:给定一个整数数组,数组中除了两个数之外,其他数都是成对存在。请找出这两个数。
思路:该题思路类似SingNumber。假如要找的两个数为x、y,先将数组中所有数相互异或,得到的结果为result = x⊕y。result转换成二进制后一定存在值为1的位。找到result中任意一位值为1的位,然后按照这一位将数组中的数分为两个数组。一个数组是那一位是1的,另一个是那一位为0的。然后两个数组的数分别异或,最后的结果就是需要找的那两个数。
JavaCode:
public class Solution {
public int[] singleNumber(int[] nums) {
int result = 0;
//将数组中的数逐个异或
for (int i = 0; i < nums.length; i++) {
result ^= nums[i];
}
int bit = 1;
//查找出结果中任意值为1的位
while (true) {
if ((result & bit) > 0) {
break;
}
else {
bit <<= 1;
}
}
int one = 0;
int two = 0;
//分成两组并各组逐一异或
for (int i = 0; i < nums.length; i++) {
if ((nums[i] & bit) > 0) {
one ^= nums[i];
}
else {
two ^= nums[i];
}
}
return new int[]{one,two};
}
}