提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
一个整型数组 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
详见注释。
class Solution {
public int[] singleNumbers(int[] nums) {
//异或大法好呀
//1.把数组中的所有数字都进行异或,最后的结果是:相同的都被消掉了,剩下的就是两个不同的数异或的结果
//2.找到两个不同数异或结果二进制中,找到从右向左的第一个不相同的位,即为1的那一位。获取二进制中只剩这个位是1而其他位是零的数,记为mov
//3.将数组中的所有数字分成两组,分组规则为:数字&mov是否为0,是则为一组,否则为另一组。注意:相同的数字必然会被放在同一组
//4.每一组的数字都异或起来,最后结果就是两个不同数字。
int k = 0;
for(int n : nums){
k ^= n;
}
//寻找标志
int mov = 1;
while((k & mov) == 0){
mov <<= 1;
}
//mov被找到了,分组
int a = 0;
int b = 0;
for(int n : nums){
if((n & mov) == 0){
a ^= n;
}else{
b ^= n;
}
}
return new int[]{a,b};
}
}
总结
暂时没有总结,待续。。。