一、只出现一次的数字
1、题目描述
2、题解:
方法1:哈希集合
假设原数组为[a,b,b],则2*(a+b)-(a+b+b)=a
class Solution:
def singleNumber(self, nums: List[int]) -> int:
#哈希集合
return 2 * sum(set(nums)) - sum(nums)
方法2:哈希映射
class Solution:
def singleNumber(self, nums: List[int]) -> int:
#哈希映射
hash_table = collections.defaultdict(int)
for i in nums:
hash_table[i] += 1
for num in nums:
if hash_table[num] == 1:
return num
方法3:列表法
class Solution:
def singleNumber(self, nums: List[int]) -> int:
#列表法
res = []
for num in nums:
if num not in res:
res.append(num)
else:
res.remove(num)
return res.pop()
方法4:位运算
异或运算的三个性质:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
#位操作
if len(nums) < 1:
return 0
if len(nums)== 1:
return nums[0]
ans = nums[0]
for i in range(1,len(nums)):
ans ^= nums[i]
return ans
3、复杂度分析:
方法1:
时间复杂度为O(N)
空间复杂度为O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)
方法3:
时间复杂度:O(N)
空间复杂度:O(N)
方法4:
时间复杂度:O(N)
空间复杂度:O(1)
二、只出现一次的数字 II
1、题目描述:
2、题解:
方法1:哈希集合
假设nums = [a,b,b,b,c,c,c],则(3*(a+b+c)-(a+b+b+b+c+c+c)) / 2 =a
class Solution:
def singleNumber(self, nums):
#哈希集合
return (3 * sum(set(nums)) - sum(nums)) // 2
方法2:哈希映射
from collections import Counter
class Solution:
def singleNumber(self, nums):
#哈希映射
hashmap = Counter(nums)
for k in hashmap.keys():
if hashmap[k] == 1:
return k
或者:
class Solution:
def singleNumber(self, nums):
#哈希映射
hashmap = collections.defaultdict(int)
for num in nums:
hashmap[num] += 1
# print(hashmap)
for num in nums:
if hashmap[num] == 1:
return num
方法3:位运算
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ones, twos = 0, 0
for num in nums:
ones = ones ^ num & ~twos
twos = twos ^ num & ~ones
return ones
3、复杂度分析:
方法1:
时间复杂度为O(N)
空间复杂度为O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)
方法3:
时间复杂度:O(N)
空间复杂度:O(1)
三、只出现一次的数字 III
1、题目描述:
2、题解:
方法1:列表法
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
#列表法
res = []
for num in nums:
if num in res:
res.remove(num)
else:
res.append(num)
return res
方法2:哈希映射
class Solution:
def singleNumber(self, nums: int) -> List[int]:
from collections import Counter
hashmap = Counter(nums)
return [x for x in hashmap if hashmap[x] == 1]
或者:
class Solution:
def singleNumber(self, nums: int) -> List[int]:
#哈希映射
hashmap = collections.defaultdict(int)
for num in nums:
hashmap[num] += 1
res = []
for num in nums:
if hashmap[num] == 1:
res.append(num)
return res
方法3:位运算
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
res = 0 #所以数字异或的结果
a = 0
b = 0
for num in nums:
res ^= num
#找到第一位不是0的值
h = 1
while res & h == 0:
h <<= 1
#分组
for num in nums:
if h & num == 0:
a ^= num
else:
b ^=num
return [a,b]
3、复杂度分析:
方法1:
时间复杂度为O(N)
空间复杂度为O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)
方法3:
时间复杂度:O(N)
空间复杂度:O(1)