问题描述
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
问题解决
位运算解决
class Solution {
public int[] singleNumbers(int[] nums) {
//巧妙使用位运算方法解决
int bit = 0;
//1.确定数组中两个不同数值的抑或结果;相同数值异或结果为0。
for(int num : nums) {
bit ^= num;
}
//2.确定异或结果中第一位为1的数值,证明在一位两个不同数字存在差异
int t = 1;
while((t & bit) == 0) {
t <<= 1;
}
//3.根据t所在位的特点把数组进行划分,一个数字在a数组,一个数字在b数组。对每个数组中的所有数字异或后得到唯一的数字,这个数字就是对应数组中出现了一次的唯一值
int a = 0, b = 0;
for(int num : nums) {
if((num & t) != 0) {
a ^= num;
}else {
b ^= num;
}
}
return new int[] {a ,b};
}
}