05 只出现一次的数字-20200317
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例
输入: [2,2,1]
输出: 1
说明
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
注意事项
- 整数数组非空,按照题目要求,数组最少有三个数字。
- 时间复杂度是O(N),最好一个循环内搞定。
- 不新开存储空间。
思路一
先对数组排序,然后一次遍历,找到三个相邻指针不一样的,中间那个指针就是。
修改经历:
1. 不是最少三个数字吗,你给我个[1],我心态崩了啊!(第一次提交)
- 执行用时 :84 ms, 在所有 Python3 提交中击败了74.65%的用户
- 内存消耗 :15.1 MB, 在所有 Python3 提交中击败了64.46%的用户
2. 虽然没有开辟新的空间,但是这里的内存消耗有点大。不过平台每次提交都会有稍许的差别,在提交一次。(第二次提交)
- 执行用时 :48 ms, 在所有 Python3 提交中击败了87.08%的用户
- 内存消耗 :15 MB, 在所有 Python3 提交中击败了93.98%的用户
3. 第二次提交结果说明,大部分答案都集中用时40-100ms,内存更是集中在15MB左右。
心得体会:
排序还是很好用的,先排序再找元素,只要不要索引就行。
最终代码展示:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
nums.sort()
if len(nums) > 1:
for i in range(1, len(nums)-1):
if nums[i-1] != nums[i] and nums[i] != nums[i+1]:
return nums[i]
elif i == len(nums)-2 and nums[i-1] == nums[i] and nums[i] != nums[i+1]:
return nums[i+1]
elif i == 1 and nums[i-1] != nums[i] and nums[i] == nums[i+1]:
return nums[i-1]
else:
return nums[0]
思路二
看到题解的方法,不得不的说大神还是大神。就一个公式 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)
思路三
朋友,听说过异或吗?大神就是不一般啊!下面就是大神的思路。
所以只要将所有的项都异或起来就可以得到只出现一次的项了。Python 3的位操作,参看知识点 Python 中的 位运算符
最终代码展示:
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
a = 0
for i in nums:
a ^= i
return a