题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
解法
法1
直观想法用一个list保存已经出现过的数,每读取一个就判断list里有没有。有就删掉,没有就丢进去。
代码如下:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
stack = []
for i in nums:
if i not in stack:
stack.append(i)
else:
stack.remove(i)
return stack[0]
法2
排序之后,单独的数要么在两头要么夹在两对数之间,分类讨论一下即可。
代码如下:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
nums = sorted(nums)
if len(nums) >= 5:
if nums[0] != nums[1]:
return nums[0]
elif nums[-1] != nums[-2]:
return nums[-1]
else:
for i in range(0, len(nums) - 2):
if nums[i] < nums[i + 1] < nums[i + 2]:
return nums[i + 1]
elif len(nums) == 3:
return nums[0] if nums[1] == nums[2] else nums[2]
else:
return nums[0]
法3
2个相同的数联想到异或的性质。如果全部异或数组中的数,如果有2个就对最后的结果没有影响(两次异或回去了),最后留下来的正好是落单的数。
代码如下:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
single_number = 0
for num in nums:
single_number ^= num
return single_number