用HashMap --好理解但复杂度不理想
class Solution {
public int singleNumber(int[] nums) {
int n = nums.length;
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<n;i++){
if(map.containsKey(nums[i])){
map.put(nums[i],map.get(nums[i]) + 1);
}else{
map.put(nums[i],1);
}
}
for (Integer k : map.keySet()) {
if (map.get(k).equals(1)) {
return k;
}
}
return 0;
}
}
位运算--很简洁很快
class Solution {
public int singleNumber(int[] nums) {
int a=nums[0];
for(int i = 1;i<nums.length;i++){
a = a^nums[i];
}
return a;
}
}
异或解法:异或运算满足交换律,a^b^a=a^a^b=b,因此ans相当于nums[0]^nums[1]^nums[2]^nums[3]^nums[4]..... 然后再根据交换律把相等的合并到一块儿进行异或(结果为0),然后再与只出现过一次的元素进行异或,这样最后的结果就是,只出现过一次的元素(0^任意值=任意值)
(概念来自leetcode某大佬)
希望本文能对你有所帮助,如果有大佬发现有错误,还希望能帮我指出来!我及时纠正;或者有朋友能够补充的也可以提出来,大家一起学习,一起进步!