1.只出现一次的数字(137)
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
题目要求:
1、线性时间复杂度:要求我们的代码时间复杂度最高为O(n),不能有嵌套循环等。
2、不使用额外空间:要求空间复杂度最高为O(1)。
3、除了某个元素只出现一次以外,其余每个元素均出现两次
解题思路1:(去重法)
利用哈希表的特性,删除重复的数组元素,最后剩下一个单独的元素,返回即可。
python代码:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
d=dict()
for num in nums:
try:
d.pop(num)
except:
d[num]=1
return d.popitem()[0]
解题思路2:位运算
对数组中所有的数字进行异或运算,数组中出现两次的数字,通过异或位运算可以去除掉。只需要遍历数组中的所有元素,依次进行两两异或操作就可以找出只出现一次的元素。
C++代码:
class Solution {
int singleNumber(vector<int>& nums) {
int tmp = 0;
for(int i = 0;i < nums.size();i++){
tmp = tmp ^ nums[i];
}
return tmp;
}
python代码:
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
ret = 0
for num in nums:
ret ^= num
return ret