题目:
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
题意:
给定一组整数,其中只有一个元素出现一次,其他的元素均出现3次。找出这个只出现一次的整数元素。
算法分析:
方法一:
// 我想大多数同学碰到这个问题都会首先考虑用HashMap,key为当前元素,value为元素出现的个数,
// 然后遍历HashMap,找出出现次数不为3的元素即可
// 时间复杂度为O(n),空间复杂度为O(n)
// 然后遍历HashMap,找出出现次数不为3的元素即可
// 时间复杂度为O(n),空间复杂度为O(n)
代码如下:
public int singleNumber(int[] nums)
{
Map<Integer, Integer> hm = new HashMap<Integer, Integer>();
int i, target = nums[0];
for (i = 0; i < nums.length; i++)
{
if (hm.containsKey(nums[i]))
{
hm.put(nums[i], hm.get(nums[i]) + 1);
}
else
{
hm.put(nums[i], 1);
}
}
Iterator<Map.Entry<Integer, Integer>> itor = hm.entrySet().iterator();
while (itor.hasNext())
{
Map.Entry<Integer, Integer> entry = itor.next();
if (entry.getValue() != 3)
{
target = entry.getKey();
break;
}
}
return target;
}
方法二:
// java里int始终占4个字节,32位,我们外层循环遍历32次,
// 然后内层循环记录0-31位每一位出现的次数,内层循环结束后将结果取余于3即为当前位的值
// 时间复杂度O(32 * n), 空间复杂度O(1)
// 然后内层循环记录0-31位每一位出现的次数,内层循环结束后将结果取余于3即为当前位的值
// 时间复杂度O(32 * n), 空间复杂度O(1)
代码如下:
public int singleNumber(int[] nums)
{
int i, j, bit, result = 0;
for (i = 0; i < 32; i++)
{
for (j = bit = 0; j < nums.length; j++)
{
if (((nums[j] >> i) & 1) == 1)
{
bit++;
}
}
bit = bit % 3;
result |= bit << i;
}
return result;
}