Leetcode 136. Single Number
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: 1Example 2:
Input: [4,1,2,1,2] Output: 4
要求线性时间,并且空间复杂度为1,因此只能考虑在原来的数组中做运算,想法是直接异或所有数,其中要单独考虑最后剩下0的异或,不然可能会有 0^0=1的状况,因此提前 remove(0),代码如下:
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if(len(nums) == 1):
return nums[0]
if 0 in nums:
nums.remove(0)
result = 0
for i in nums:
result = result ^ i # 0^i=i , i^i=0
return result
Discuss中的解法:
1.运算法:
就很神奇,巧妙用了set()
2∗(a+b+c)−(a+a+b+b+c)=c
代码如下:
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return 2 * sum(set(nums)) - sum(nums)
2.hash表
用字典的key和point来做桶和值,很巧妙
def singleNumber1(self, nums):
dic = {}
for num in nums:
dic[num] = dic.get(num, 0)+1
for key, val in dic.items():
if val == 1:
return key