题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
思路
如果不考虑线性时间复杂度,我们可以利用哈希表来解决这个问题。
代码
import java.util.HashMap;
import java.util.Map;
class Solution {
public int singleNumber(int[] nums) {
//找出只出现一次的数字,其他的都是出现了三次
Map<Integer,Integer> hashmap=new HashMap<>();
int length=nums.length;
for (int i=0;i<length;++i)
if (!hashmap.containsKey(nums[i]))
hashmap.put(nums[i],1);
else
hashmap.put(nums[i],hashmap.get(nums[i])+1);
int result=0;
for (Map.Entry<Integer, Integer> entry : hashmap.entrySet())
{
// System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
if (entry.getValue()==1)
{
result=entry.getKey();
}
}
return result;
}
}
结果
意料之中,暴力解法,太慢了
另外的思路
也可以利用set,取出所有数,然后将这个set里面的数的和再去乘以3,再减去数组的所有数,剩下的那个就是只出现一次的数的两倍。
代码
import java.util.HashSet;
import java.util.Set;
class Solution {
public int singleNumber(int[] nums) {
Set<Long> set = new HashSet<>();
long sumSet = 0, sumArray = 0;
for(int n : nums) {
sumArray += n;
set.add((long)n);
}
for(Long s : set) sumSet += s;
return (int)((3 * sumSet - sumArray) / 2);
}
}