方法1:HashMap
取nums中每一个不重复元素,如果哈希表中不存在该元素值则初始键值为1,存在该元素值则使value++;后面取哈希表中的每一个value。没啥可写的。。Hashmap非线程安全、键值允许为null
class Solution {
public int singleNumber(int[] nums) {
Map <Integer,Integer> map=new HashMap<>();
for(Integer nums_key:nums){//把nums数组的每一个元素不重复作为key
Integer nums_value=map.get(nums_key);
//nums_value==null?nums_value=1:nums_value++;
if(nums_value==null){
nums_value=1;
}else{
nums_value++;
}
map.put(nums_key,nums_value);
}
for(Integer key:map.keySet()){
Integer value=map.get(key);
if(value==1){
return key;
}
}
return -1;
}
}
时间复杂度:O(n)
空间复杂度:O(n)
方法2:位运算
异或运算: 0 ^ a==a a^a == 0
class Solution {
public int singleNumber(int[] nums) {
int ant=0;
for(int i:nums){ //取数组内每个元素
ant=ant^i; //初始0^a==a 后续a^a=0 最终b^c^c=b
}
return ant;
}
}
//异或运算^ 0^a=a a^a=0
空间复杂度:O(1)