【英文题目】(学习英语的同时,更能理解题意哟~)
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
【中文题目】
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
【思路】
本题较为简单,使用字典即可:遍历数组元素,当元素存在字典中,可以选择字典中该元素value加1,也可以选择删除字典中该元素,否则将该元素添加至字典,最后满足条件的元素是字典中元素value最小的(采用加1方法)或者是字典中唯一元素(采用删除方法)
另外一种解法,利用到数学。
异或操作:对二进制位进行异或,两数相同则为0,两数不同则为1,比如1+1=0,1+0=1。
由于同一个数的二进制表示是一样的,因此两个相同的数进行异或,结果为0。
因此,对数组所有元素进行异或,由于只有一个元素出现一次,其他元素出现两次,那么异或后的结果就为只出现一次的元素。
【代码】
python版本
hash
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
d = {}
for n in nums:
if n in d:
d.pop(n)
else:
d[n] =
return d.keys()[]
异或
class Solution(object):
def singleNumber(self, nums):
res =
for n in nums:
res ^= n
return res
C++版本
hash
class Solution {
public:
int singleNumber(vector<int>& nums) {
map<int, int> d;
for(int i=; i<nums.size(); i++){
// 未找到
if(d.find(nums[i]) == d.end())
d[nums[i]] = ;
else
d.erase(nums[i]);
}
return d.begin()->first;
}
};
异或
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = ;
for(int i=; i<nums.size(); i++){
res ^= nums[i];
}
return res;
}
};