数组中数字出现的次数I
题目:
一个整型数组 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]
思路:
两个相同的数进行^运算的结果为0,且^运算符合交换律。如果是在一个数组找只出现一次的数,就可以将所有的数进行^运算。在数组中寻找两个只出现一次的数,需要对数组进行分类,相同的数进行分类一定在同一个内别里。&运算可以用来区某一位数,列如区分奇偶数num&1。难点是如可将只出现一次的两个数分开,如果两个数不相同那么他们的二进制数至少有一位0和1不相同, 可以用一个标记数来标记那一位将两个数分开,去那个数能取的最小值,然后将nums数组用标记数分开进行^运算。
num1: 101110 110 1111
num2: 111110 001 1001
num1^num2: 010000 111 0110
可行的mask: 010000 001 0010
代码:
class Solution {
public int[] singleNumbers(int[] nums) {
int num=0;
for(int i=0;i<nums.length;i++){
num=num^nums[i];
}
int n=1;
while((n&num)==0){
n<<=1;
}
int a=0,b=0;
for(int i=0;i<nums.length;i++){
if((n&nums[i])==0){
a^=nums[i];
}else{
b^=nums[i];
}
}
return new int[]{a,b};
}
}
浙公网安备 33010602011771号