给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
输入:nums = [2,2,3,2]
输出:3
法一:朴素方法,hashmap计数
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 );
}
for(int x:map.keySet()){
if(map.get(x)==1){
return x;
}
}
return -1;
}
记录每个数字的出现次数,最后遍历map,找到次数为1的key值,需要用到map.keySet()将map转换成key的列表。
法二:位运算
public int singleNumber(int[] nums) {
int[] cnt=new int[32];
for(int x:nums){
for (int i = 0; i <32 ; i++) {
if(((x>>i)&1)==1){
cnt[i]++;
}
}
}
int ans=0;
for (int i = 0; i <32; i++) {
if((cnt[i]%3&1)==1){
ans+=(1<<i);
}
}
return ans;
}
int大小为32位,因此先遍历数组,将每个数的相应位为1的部分相加,那么结果一定是3n或者3n+1,其中3n+1的部分表示我们需要的那个只出现一次的数字在该位为1,遍历cnt后将所有为1的位相加即可得到结果。
位运算的运算速度较快。