给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
输入: [2,2,1]
输出: 1
输入: [4,1,2,1,2]
输出: 4
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
方案一:双重循环遍历(暴力解法)
class Solution { public int singleNumber(int[] nums) { for(int i=0;i<nums.length;i++){ int flag=0; for(int j=0;j<nums.length;j++){ if(nums[i]==nums[j]){ flag++; } } if(flag==1)return nums[i]; } return 0; } }
方案二:排序遍历找不同
class Solution { public int singleNumber(int[] nums) { Arrays.sort(nums); if(nums.length<2) return nums[0]; if(nums[0]!=nums[1]) return nums[0]; else if(nums[nums.length-1]!=nums[nums.length-2]) return nums[nums.length-1]; for(int i=1;i<nums.length-1;i++){ if(nums[i]!=nums[i-1]&&nums[i]!=nums[i+1]){ return nums[i]; } } return 0; } }
方案三:异或(长知识了,还能这样)
简述:异或运算的特征:
任何数与0异或都是其本身
任何数与自己做异或都是0
异或运算满足交换律:a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ (a ⊕ a)= b ⊕ 0 = b
class Solution { public int singleNumber(int[] nums) { int res=0; for(int num:nums){ res ^= num; } return res; } }
方案四:哈希表
class Solution { public int singleNumber(int[] nums) { Map<Integer,Integer> map=new HashMap(); for(Integer i:nums){ Integer count=map.get(i); count = count == null ? 1 : ++count; map.put(i,count); } for(Integer i:map.keySet()){ if(map.get(i)==1) return i; } return 0; } }