给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,3,2] 输出: 3
示例 2:
输入: [0,1,0,1,0,1,99] 输出: 99
思路分析:又又又又又来搞事情了。。。
相对于之前的只出现一次的数字一文中,还是原来的第一条思路,但是这次开的是一个map,所以就是简单的遍历加标记,记录数字出现次数,然后再遍历map寻找出现一次的数字,OK这题解决了。。。。。
BUT能不能用位运算解决呢?OF COURSE,thinking thinking,如果某个元素重复三次,那么相对应的二进制中的一之和是不是得3的倍数,而如果在某一时刻遇到了出现一次的元素,那岂不是对应的二进制为一的和不是3的倍数,所以找到不是3的倍数的二进制位置,异或一下就求出来啦。。详情看代码
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;
int[]temp = new int[33];
for(int num:nums)
{
int r = 1;
int j = 32;
while(j >= 0)
{
if((num&r) != 0)temp[j]++;
j--;
r = r << 1;
}
}
int r = 1;
int j = 32;
while(j >= 0)
{
if(temp[j]%3 != 0)
ans = ans ^ r;
r = r << 1;
j--;
}
return ans;
}
}