只出现一次的数字【LC136】
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
map
使用map统计每个数字出现的次数,最后返回只出现一次的元素
- 代码
class Solution { public int singleNumber(int[] nums) { Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < nums.length;i++){ map.put(nums[i],map.getOrDefault(nums[i],0)+1); } Set<Map.Entry<Integer,Integer>> set = map.entrySet(); for (Map.Entry<Integer,Integer> node : set){ if (node.getValue() == 1){ return node.getKey(); } } return -1; } }
- 复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)
排序
将数组从小到大排序,返回与下一个元素不相等的元素
class Solution { public int singleNumber(int[] nums) { Arrays.sort(nums); int i = 0; while ( i < nums.length - 1 ){ if (nums[i] == nums[i+1]){ i = i + 2; }else{ return nums[i]; } } return nums[i]; } }
- 复杂度
- 时间复杂度:O(nlogn)
- 空间复杂度:O(1)
*异或
任何一个数字异或它自己的结果都是0。如果将数组中的所有数字进行异或运算,那么最终的结果就是那个只出现一次的数字
- 代码
class Solution { public int singleNumber(int[] nums) { int res = 0; for (int i = 0; i < nums.length; i++){ res = res ^ nums[i]; } return res; } }
- 复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)