给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
方法一:利用哈希表来做,unordered_map<int,int> map
,map[nums[i]]==1
。
方法二:数学方法
方法一: O(n)
方法二: O(n)
方法一:O(n)
方法二:O(1)
C++:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res =0;
unordered_map<int,int> map;
int n=nums.size();
for (int i=0;i<n;i++)
{
map[nums[i]]++;
}
for (int i=0;i<n;i++)
{
if (map[nums[i]]==1)
{
res = nums[i];
break;
}
}
return res;
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res=0;
unordered_set<int> st;
for (int num : nums)
{
if (st.find(num)!=st.end()) // if (st.count(num))
st.erase(num);
else
st.insert(num);
}
res = *st.begin();
return res;
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for (auto num:nums)
{
res = res ^ num;
}
return res;
}
};
class Solution:
def singleNumber(self, nums: List[int]) -> int:
hash_table = {}
for num in nums:
try:
hash_table.pop(num)
except:
hash_table[num] = 1
res = hash_table.popitem()[0] ## Python 字典 popitem() 方法随机返回并删除字典中的最后一对键和值。如果字典已经为空,却调用了此方法,就报出KeyError异常。
return res
class Solution:
def singleNumber(self, nums: List[int]) -> int:
res = 0
res = 2*sum(set(nums)) - sum(nums) ## set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
return res
class Solution:
def singleNumber(self, nums: List[int]) -> int:
res = 0
for num in nums:
res = res ^ num
return res