题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/single-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
法1:利用字典计数,遍历两遍,找出字典中值为1的关键字
class Solution:
def singleNumber(self, nums: List[int]) -> int:
dic={}
for i in nums:
dic[i]=dic.get(i,0)+1
for i in dic:
if dic[i]==1:
return i
法2:位运算
该题可用位运算中的异或运算⊕
异或运算有以下三个性质:
- 任何数和0做异或运算,结果仍然是原来的数,即a⊕0=a。
- 任何数和其自身做异或运算,结果是0,即a⊕a=0。
- 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
由上述三条性质可得,将所给数组中所有的数异或在一起得到的结果就是只出现一次的那个数
class Solution:
def singleNumber(self, nums: List[int]) -> int:
n=0
for i in nums:
n^=i
return n