问题描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1] 输出: 1 示例 2:

输入: [4,1,2,1,2] 输出: 4

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/single-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.基本思想

  (1):将list排序,两两一组比较,若不相等,则返回第一个数字;否则就返回最后一个数字;
  (2):将list按奇数偶数位置拆分成两个set求差集,则差集中值就是最终的结果。

2.1常规法
# -*- 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()方法将其转化成列表才可进行索引。