给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
题目来源:只出现一次的数字
方法一:
1)创建一个map,统计数组中数字出现的次数,key表示数字,value表示出现的次数
2)循环遍历数组,完成统计,如果这个数字在数组中第一次出现,就map.put(x,1),如果之前出现过了,就在当前次数上加1
3)遍历map,找出value为1的key
class Solution {
public int singleNumber(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
for(int x:nums){
Integer value=map.get(x);
if(value==null){
map.put(x,1);
}else{
map.put(x,value+1);
}
}
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue().equals(1)){
return entry.getKey();
}
}
return 0;
}
}
方法二:
异或:相同为0,相异为1
public int singleNumber(int[] nums) {
int ret=0;
for(int x:nums){
ret^=x;
}
return ret;
}
扩展
题目来源:扩展
思路:
//1.先把所有的数字异或到一起
int ret=0;
for(int x:nums){
ret^=x;
}
//2.此时的异或结果相当于a^b,值一定不为0,就可以从中找到某个值为1的bit位
int bit=1;
int i=0;
for(;i<32;i++){
if((ret&(bit<<i))!=0){
break;
}
}
//循环结束之后,bit中的值,就是刚找到某一位为1的值
//进行分组
int a=0;
int b=0;
for(int x:nums){
if((x&(bit<<i))!=0){
//第一组,指定为1
a^=x;
}else{
//第二组,指定为0
b^=x;
}
}
int[] array={a,b};
return array;
}