1.基本思想给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1 示例 2:
输入: [4,1,2,1,2] 输出: 4
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/single-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
(1):将list排序,两两一组比较,若不相等,则返回第一个数字;否则就返回最后一个数字;
(2):将list按奇数偶数位置拆分成两个set求差集,则差集中值就是最终的结果。
# -*- coding: utf-8 -*-
'''
问题简述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了两次,
找出那个只出现一次的元素。
基本思路:
将数组排序,两两一对元素肯定相等,若不相等,则返回第一个不相等元素;
或者最后一个元素就是只出现一次的数字。
'''
class Solution():
'''
input: list
output: int
'''
def singleNumber(self,nums):
nums.sort() # 排序
if len(nums) == 1: # 若仅包含一个元素,则一定是仅出现一次的元素
return nums[0]
i=0
while i<len(nums)-2: # 假设len(nums) = 5,那么最后一组下标为2就该停止,所以i=0,2,故 i< 5-2=3即可。
if nums[i] != nums[i+1]:
return nums[i]
else:
i = i+2
return nums[-1] # 假若没找到,则最后一个元素就是不重复元素。
if __name__ == '__main__':
ilist = [4,1,2,3,1,2,3]
solu = Solution()
res = solu.singleNumber(ilist)
print('单个数字为:\n',res)
2.2集合法
# -*- coding: utf-8 -*-
'''
问题简述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了两次,
找出那个只出现一次的元素。
基本思路:
给数组排序,按照奇数偶数将list分成两个集合,之后求两个集合的差集就是孤零零的元素。
'''
class Solution():
'''
input: list
output: int
'''
def singleNumber(self,nums):
nums.sort() # 排序
res = list(set(nums[::2]) - set(nums[1::2]))
return res[0]
if __name__ == '__main__':
ilist = [4,1,2,3,1,2,3]
solu = Solution()
res = solu.singleNumber(ilist)
print('单个数字为:\n',res)
总结
a. 在第一种方法中:注意list长度为1的特殊情况;i下标索引的范围i<len-2;最后循环中没有出现单个元素,则return nums[-1]。
b. 在集合中,不能通过集合进行索引,即set[i]。这种索引方式是错误的。因此集合是无序的,不能索引。报错信息为:TypeError: ‘set’ object is not subscriptable。即类型错误,不能出现索引。只能通过list()方法将其转化成列表才可进行索引。