从一个数组中寻找出现奇数次的数字
假设给定了数组nums为[0,1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,1,2,3,3,0]
其中3出现了3次
而其他数字都出现了两次
则我们应该得到结果为3
第一种方式:使用Hash
1 /** 2 * 使用hash 3 * */ 4 public static int singleNumber_1(int[] nums) { 5 Map<Integer, Integer> map = new HashMap<>(); 6 for(Integer num : nums) { 7 /* 8 * 1.remove与put操作相对耗费时间 9 * 10 * if(map.containsKey(num)) { 11 * map.remove(num); 12 * }else { 13 * map.put(num, 0); 14 * } 15 * **/ 16 if(map.get(num) != null) { 17 map.put(num, map.get(num)+1); 18 }else { 19 map.put(num, 1); 20 } 21 } 22 int result = -1; 23 for(Integer key : map.keySet()) { 24 if(map.get(key)%2 != 0) { 25 result = key; 26 } 27 28 } 29 return result; 30 }
第二种方式:使用^
1 /** 2 * 异或 3 * a^b^c^b^a = (a^a)(b^b)^c = 0^c = c 4 * */ 5 public static int singleNumber_2(int [] nums) { 6 int ans = nums[0]; 7 if (nums.length > 1) { 8 for (int i = 1; i < nums.length; i++) { 9 System.out.println(ans + "^" + nums[i] + ":"); 10 ans = ans ^ nums[i]; 11 System.out.println(ans); 12 } 13 } 14 return ans; 15 }