Leetcode136–只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
编程语言:python
作者:黑暗主宰
邮箱:shengzhanhe@gmail.com
Leetcode136–只出现一次的数字
题目描述
原题链接:
https://leetcode-cn.com/problems/single-number/ (中文)
https://leetcode.com/problems/single-number/ (英文)
题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1: 输入:[2,2,1] 输出: 1 |
---|
示例 2: 输入: [4,1,2,1,2] 输出: 4 |
---|
解题思路
Leetcode官方题解1提供了四种方法,这里博主也按照自己刷题时的想法重新的编写。
空间复杂度为 O ( 1 ) O(1) O(1) 的方法
方法1:
异或求解;题目中说只有一个元素出现一次,其余的都出现两次,异或操作中,相同的元素异或等于零,零与任何数进行异或等于本身,所以最后输出的非零数就是只出现一次的元素。代码和图解2如下:
def singleNumber(nums):
res = nums[0]
for num in nums[1:]:
res ^= num
return res
使用额外的空间的方法
方法2:(需要额外空间)
列表操作,首先建立一个空列表,循环nums中的每一个元素,判断元素是不是在列表中,若是存在则把该元素从列表中移除,若是不存在则把原始添加进列表。最后列表中只剩下一个元素,就是结果
def singleNumber(nums):
nums_tmp = []
for num in nums:
if num in nums_tmp:
nums_tmp.remove(num)
else:
nums_tmp.append(num)
return nums_tmp[0]
方法3:(需要额外空间)
使用额外空间的方法;建立一个哈希表,统计每个元素出现的次数,只出现一次的数字就是要返回的数字。
def singleNumber(nums):
hash_dict = {}
for num in nums:
if num in hash_dict:
hash_dict[num] += 1
else:
hash_dict[num] = 1
for key in hash_dict:
if hash_dict[key] == 1:
return key
方法4:
使用数学的方法,直接给出一个公式,小伙伴们估计瞬间就懂了。nums = [a,a,b,b,c]
2
×
(
a
+
b
+
c
)
−
(
a
+
a
+
b
+
b
+
c
)
=
c
2 \times \left( {a + b + c} \right) - \left( {a + a + b + b + c} \right) = c
2×(a+b+c)−(a+a+b+b+c)=c
def singleNumber(nums):
nums_tmp = set(nums)
return 2*sum(nums_tmp)-sum(nums)
方法5:
把nums排序,然后首先确定第一个元素是不是出现一次的数,然后中间的元素判读,若是 n u m s [ i − 1 ] ≠ n u m s [ i ] ≠ n u m s [ i + 1 ] nums\left[ {i - 1} \right] \ne nums\left[ i \right] \ne nums\left[ {i + 1} \right] nums[i−1]=nums[i]=nums[i+1] ,直接返回结果,循环终止后,还没有找到,那就是最后一个元素
def singleNumber(nums):
if len(nums) == 1:
return nums[-1]
nums.sort()
if nums[0] != nums[1]:
return nums[0]
for i in range(1, len(nums)-1):
if (nums[i-1] != nums[i]) and (nums[i] != nums[i+1]):
return nums[i]
return nums[-1]
方法6:(使用额外空间)
先把nums中的重复的元素去掉(python中的set函数),然后统计每一个元素在原数组中出现的次数
**注:**使用set和count效率特别低,会超时
def singNumber(nums):
nums_tmp = set(nums)
for num in nums_tmp:
cnt = nums.count(num)
if cnt == 1:
return num
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分析技术问题,我们一起学习进步
注: 文中有写错的地方,欢迎大家不吝指正!!!