leetcode刷题-136-只出现一次的数字

问题描述

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

示例

示例 1:

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

示例 2:

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

实现

1 hash

使用字典存储元素以及元素出现次数,查询字典中出现次数为1的元素返回

时间复杂度O(n)

def num_only_once_dic(nums):
    """
    使用额外空间实现
    使用字典存储元素以及元素出现次数
    查询字典中出现次数为1的元素
    """
    nums_dic = {}

    for num in nums:
        if num in nums_dic:
            nums_dic[num] += 1
        else:
            nums_dic[num] = 1

    for vec in nums_dic:
        if nums_dic[vec] == 1:
            return vec

    return None

2 双指针

先排序

再使用双指针移动检查,指针移动步长为2

检查前后指针所指元素是否相同,不相同返回前指针所指元素

当检查到倒数第二组还为发现所选元素,那么所选元素一定为组后一个元素,跳出循环,直接返回最后一个元素

不占用额外空间

def num_only_once(nums):
    """
    不使用额外空间实现
    先排序
    再使用双指针移动检查,指针移动步长为2
    检查前后指针所指元素是否相同,不相同返回前指针所指元素
    """
    pre_point = 0
    check_point = 1
    nums_len = len(nums)

    nums.sort()

    while check_point != nums_len and nums_len != 0:
        if nums[pre_point] == nums[check_point]:
            pre_point += 2
            check_point += 2
        else:
            return nums[pre_point]

    return nums[nums_len-1]
posted @ 2019-12-25 11:16  L__H  阅读(193)  评论(0编辑  收藏  举报