标签:== get ber http amp ash pre return numbers
?
第一次解题思路:
public int[] singleNumbers(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
for(int num:nums){
if(map.containsKey(num)){
map.put(num,map.get(num)+1);
}else{
map.put(num, 1);
}
}
int [] ans=new int[2];
int count=0;
for(Map.Entry<Integer,Integer>entry:map.entrySet()){
if(entry.getValue()==1){
ans[count++]=entry.getKey();
}
}
return ans;
}
优化
解题思路:分组位运算
? 题目要求时间复杂度O(n),空间复杂度为O(1),因此不能用map(空间复杂度O(n))
?
代码如下:
//使用分组位运算
public int[] singleNumbers3(int[] nums) {
//因为只有两个数出现一次,数组全部元素进行异或运算的值 等同于 这个两个元素异或运算的值
int k=0;
for(int num:nums){
k^=num;
}
//两个数异或值不等于0 说明什么?说明这两个数不同 那这两个数在哪一位不同 对应位的异或值为1的地方不同
//两个不同的数异或运算的结果 k 对k从低位往高位寻找 两个数某位不同的所在位置 (即k从最低位开始 首次出现‘1‘的位置)
//找到区分值,就可以将这两个数 分到 两个不同分组
int first=1;
while((first&k)==0){
first<<=1;
}
//0跟数异或等于数本身 相同数异或等于0
//在各自分组中 只有一个数出现了一次 其他数都出现两次
//各个分组 各自异或运算 结果值为 只出现过一次的数
int a=0;
int b=0;
for(int num:nums){
if((num&first)==0){
a^=num;
}else{
b^=num;
}
}
return new int[]{a,b};
}
标签:== get ber http amp ash pre return numbers
原文地址:https://www.cnblogs.com/yh-simon/p/12818844.html