• 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]
    
  • 相关阅读:
    中值定理
    poj 3984 迷宫问题 bfs
    android 处理网络状态——无网,2g,3g,wifi,ethernet,other
    POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
    Android硬件加速
    Android的横竖屏切换
    滑雪_poj_1088(记忆化搜索).java
    Rank of Tetris(hdu1811拓扑排序+并查集)
    git在windows下clone、pull或者push内存溢出的解决办法
    数据库中DDL、DML、DCL和TCP概念
  • 原文地址:https://www.cnblogs.com/liuheblog/p/12095648.html
Copyright © 2020-2023  润新知