前言
仅记录学习笔记,如有错误欢迎指正。
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例一
- 输入: [2,2,1]
- 输出: 1
示例二
- 输入: [4,1,2,1,2]
- 输出: 4
tips:
看到不重复的题应该想到hashSet的,又复习了一下异或的知识,都忘记的差不多了。。
异或:不同数字为1,其他都为0,任何数字和0异或都为本身。
如 0101^1011 = 1110
如 1010^1100 = 0110
解法一
用HashMap来写。
public int fun3(int[] arr){
HashMap<Integer,Integer> map = new HashMap<>();
for(int i= 0 ;i<arr.length;i++){
if(!map.containsKey(arr[i])){
map.put(arr[i],1);
}else{
int num =map.get(arr[i]);
map.put(arr[i],num+1);
}
}
Iterator<Integer> iterator = map.keySet().iterator();
while(iterator.hasNext()){
int key = iterator.next();
if(map.get(key)==1){
return key;
}
}
throw new RuntimeException("没有重复的数字");
}
解法二
用HashSet
public int fun(int[] arr){
Set<Integer> set = new HashSet<>();
for(int i= 0 ;i<arr.length;i++){
if(!set.add(arr[i])){
set.remove(arr[i]);
}
}
return set.iterator().next();
}
解法三
异或法
public int fun1(int[] arr){
int num = 0;
for(int i= 0 ;i<arr.length;i++) {
num = num^arr[i];
}
return num;
}
解法四
直接用数组写
public int fun4(int[] arr){
Arrays.sort(arr);
int i;
for(i=0;i<arr.length-1;i++){
if(arr[i]==arr[i+1]){
i++;
}else {
break;
}
}
return arr[i];
}