原文链接:[刷题]Leetcode-136:Single Number(只出现一次的数字) - 高歌的博客
题目详情
题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
解题思路
首先想到了用暴力搜索的方式,新建一个s list,对nums中的元素逐一迭代,判断元素是否在s中,如果s存在迭代的元素,则否定该元素,直到找到唯一的数字,这个思路最容易想到,代码也很容易写出就不展示了,但是最后结果肯定是超时,因为题目的考察重点不在于此。同样用python自带的list.count(i)
的方式也会超时,因为本质上还是在暴力搜索。
因为只有一个元素是出现一次的,很容易想到了异或运算,二进制位相同为0相异为1,这样可以用一个变量做筛选,只需要len(nums)
次异或运算就能找到结果,尝试解题方案如下:
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
temp = 0
for i in nums:
temp = temp ^ i
return temp
通过,耗时在100ms之内,翻看其他人的解体方案,一个很巧妙的方案:
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return sum(set(nums)) * 2 - sum(nums)
因为只有一个元素出现一次,直接set去重求2倍和,然后和nums的和相减直接get目标,nice!