首页 > 其他分享 >136. 只出现一次的数字

136. 只出现一次的数字

时间:2023-10-19 19:13:23浏览次数:26  
标签:一次 return 数字 nums int 元素 reduce 异或 136

目录

题目

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

    你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1]
输出:1

法一、排序加遍历

  • 思路:先对数组进行排序,然后遍历数组,每次跳过出现两次的元素。当找到一个元素与下一个元素不相等时,即找到了只出现一次的元素。
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        nums = sorted(nums)
        for i in range(len(nums)-1):
            if nums[i] != nums[i+1]:
                return(nums[i])
            i+=1#错误,应该一次跳过两个元素
  • 第一次解决时,没通过,很多地方没考虑到:应该一次跳过两个元素;数组只有一个元素的情况未考虑到;只出现一次的元素在最后一个位置的情况

  • 如果找到了只出现一次的元素,就直接返回该元素。如果整个循环结束后仍未找到只出现一次的元素,说明只出现一次的元素在数组的末尾,因此我们返回 nums[-1]。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        nums.sort()  # 先对数组进行排序
        n = len(nums)
        i = 0
        while i < n:
            if i == n - 1 or nums[i] != nums[i + 1]:#数组只有一个元素或者找到不相等的元素时
                # 当前元素与下一个元素不相等,即找到了只出现一次的元素
                return nums[i]
            i += 2  # 跳过出现两次的元素
        # 如果只出现一次的元素在数组末尾
        return nums[-1]
  • 时间复杂度为 O(nlogn)。

法二、异或性质

  • 异或运算:
    任何数和自己做异或运算,结果为0,即 a⊕a=0
    任何数和0做异或运算,结果还是自己,即 a⊕0=a
    异或运算中,满足交换律和结合律,也就是 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        x = 0
        for num in nums:  # 1. 遍历 nums 执行异或运算
            x ^= num      
        return x;         # 2. 返回出现一次的数字 x

时间复杂度O(N):线性遍历nums使用O(N)时间,异或操作使用O(1)时间
空间复杂度O(1):辅助变量a,b,x,y使用常数大小额外空间

法三、reduce()函数

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
       return reduce(operator.xor, nums)#xor表示异或
  • reduce()函数会对参数序列中元素进行累积,接收的参数:一个函数 f,一个list,实例如下:
from functools import reduce

def add(x, y) :            # 两数相加
    return x + y
sum1 = reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
sum2 = reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数
print(sum1)   #15
print(sum2)   #15

标签:一次,return,数字,nums,int,元素,reduce,异或,136
From: https://www.cnblogs.com/lushuang55/p/17775399.html

相关文章

  • 第一次博客——分享C语言学习
    今天又是在寝室里学习C语言的一天,学校里老师上课有点水,只能自己学习,幸好有比特鹏哥的帮助,C语言水平稳步增长。今天在鹏哥的带领下,学习了选择语句和循环语句。选择语句学习了if结构和switch结构,个人感觉switch结构虽然适用于多分支比较方便,但整型的限制比较大,很多语句后都不能遗忘br......
  • 记一次在服务器上运行node.js程序时无法通过nohup xxx & 方式挂起的问题
       由于业务需求每天要在服务器上整理一组数据,为了方便就用node.js来写了。但是运行的时候发现了一个问题明明使用了nohupmain.js&的方式后台运行了程序但是一旦我关闭了shell控制台这个后台运行的程序也会跟着终止掉,不知道是什么原因,于是采用forever.js的方式来运行......
  • 力扣12.整数转罗马数字
    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写做 II ,即为两个并列的1。12写做 XII ,即为 X + I......
  • Python中如何将字符串变成数字?
    字符串和数字是Python中常见的数据类型,而且在撰写Python程序的时候,也经常会遇到需要将字符串转换为数字的情况,那么Python中如何将字符串变成数字?有多种方法可以使用,接下来一起来看看具体内容介绍。1、使用int()函数int()函数可以将字符串转换为整数类型。例如,将字符串......
  • 错误 NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项
    背景:当同一解决方案的项目A引用项目B的时候出现引用异常 大概意思是项目A的框架类型是.net7.0,项目B的框架类型是net7.0-windows两者不兼容查看了连着的项目类型发现项目B是指定为Windows操作系统(注:建立类库项目B时没有指定操作系统,不知为啥显示指定了) 类库项目A是没指定......
  • 罗马数字与阿拉伯数字
    罗马数字与阿拉伯数字关于罗马数字罗马数字是位置计数吗?罗马数字是一种部分位置计数系统。在传统的罗马数字表示法中,不同的符号代表不同的数值,这些符号的位置顺序和组合决定了最终表示的数值。因此,符号的位置确实在一定程度上影响数值的大小。然而,与二进制和十进制不同,罗马数......
  • 服务商品化,数字经济正在带活一个数十万亿大市场
    今年的消费复苏走势,刚刚过去的十一超级黄金周是很好的观察窗口。据朋友圈不完全统计,至少5个朋友在国外旅游,3个朋友参加了音乐节,2个朋友选择租车自驾游,更多的朋友跟家人聚餐、看电影......就像结婚三大件,从“手表、自行车、缝纫机”到“冰箱、彩电、洗衣机”,再到“房子、车子、票子......
  • 罗马数字转阿拉伯数字
    罗马数字是位置计数吗?它的缺点是什么?罗马数字不是位置计数。罗马数字不是基于数字的位置来宾市数据,而是通过组合特定的符号来表示数字,每个符号斗代表特定的数值。罗马数字有以下缺点:不能表示零。不适用表示较大的数值。不适合进行计算,难以进行加减乘除等数学运算。用罗......
  • 企业级 SigningPDF 数字签名 - 如何安装 GlobalSign AATL 文档签名证书
    派胜SigningPDF全球签是一款企业级PDF数字签名软件,可信数字签名、电子印章和时间戳解决方案。SigningPDF支持Adobe全球认可的证书颁发机构,高自动化为PDF文档添加可信合法的数字签名。访问SigningPDF官网下载最新版。https://www.paioffice.com/signingpdf/downloads(1)申......
  • 项目播报 | 璞华科技助力苏州巨迈科构建数字化管理体系
    项目播报近日,苏州巨迈科智能科技有限公司(以下简称:苏州巨迈科)签约璞华科技实施PLM项目,建立苏州巨迈科统一的研发管理平台,实现产品数据在部门间的共享,提升企业技术管理水平和综合竞争力,提高信息化管理水平。苏州巨迈科是集自动化设备和工业软件一体化的智能制造整体解决方案提供......