自己做的网站图片打开慢/网络营销学院
前言
仅记录学习笔记,如有错误欢迎指正。
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例一
- 输入: [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];}