题目描述:
Given an array of integers, every element appears three times except for one,
which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity.
Could you implement it without using extra memory?
(给定一组整数,除了一次出现一次外,每个元素都出现三次。找到那一个。
注:
你应该有一个线性时间复杂度的算法。你能实现它,而无需使用额外的内存?)
思路:用一个大小为32的count数组来保存nums数组中所有整数转化为二进制之后i位上1的个数,如果说所有整数均出现三次,
那么count数组各位上的值一定是3或3的倍数,现在有一个只出现一次的数,那么这个数的出现会导致count数组有些位
上的值不是3或3的倍数,找到这些位就可以还原只出现一次的数。
public class Single_Number_II {
public static int singleNumber(int[] nums)
{
int count[] = new int[32];
int result = 0;
for(int i=0;i<32;i++)
{
for(int j=0;j<nums.length;j++)
{
if(((nums[j]>>i)&1)==1)
{
count[i]++;
}
}
//因为只有一个出现一次的数,所以count[i]%3只可能是0或1
result = result|((count[i]%3)<<i);
}
return result;
}
public static void main(String[] args) {
int nums[] = {5,2,2,2,3,3,3};
System.out.println(singleNumber(nums));
}
}