leetcode136 —只出现一次的数字

文章目录

  • leetcode136 ---只出现一次的数字
    • 题目
    • 方法
      • 1.位运算法
        • 异或运算性质
        • 思路
      • 2.字典 哈希表法
    • 总结

题目

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

说明:

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

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number


方法

1.位运算法

异或运算性质

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。

异或运算性质:

  1. 交换律,即 a ^ b ^ c = a ^ c ^ b
  2. 结合律, 即 (a ^ b) ^ c = a ^ ( b ^c )
  3. 对于任何数,都有 a ^ a = 0, a ^ 0 = a
  4. 自反性, a ^ b ^ b = a ^ 0 = a

思路

通过利用异或运算的交换律,相同的两个整数异或后会为0,所以数组中的元素会两两相消,留下单独存在的元素。
即 a ^ b ^ a = a ^ a ^ b = 0 ^ b = b
所以对整个数组进行异或操作,结果即为所要查找的值。

代码如下:

class Solution:def singleNumber(self, nums: List[int]) -> int:# 异或运算result = 0for i in nums:result = result^ireturn result

也可以通过lambda生成式简写如下:

class Solution:def singleNumber(self, nums: List[int]) -> int:# 异或运算return reduce(lambda x,y: x^y, nums)

reduce函数的语法如下:

复杂度分析

  • 时间复杂度:O(n), 遍历整个数组进行了常数次操作。
  • 空间复杂度:O(1), 只存在一个变量。

这个方法还可以用于 给定数组中一个元素出现两次,其他都是一次,查找这个出现两次的元素问题。

  • 例如1到1000这种知道具体数字的,可以通过与1到1000依次进行异或,运算后的结果就为所求的值。

2.字典 哈希表法

  • 通过enumerate函数遍历数组生成字典,即哈希表,按照数组的值作为字典的键,在数组中的出现次数作为值。
  • 字典完成后,遍历字典,找到值为1的键并返回,即找到了只出现一次的数字。

代码如下:

class Solution:def singleNumber(self, nums: List[int]) -> int:dict1 = {}for i, d in enumerate(nums):if d in dict1.keys():dict1[d] += 1else:dict1[d] = 1for key in dict1.keys():if dict1.get(key) == 1:return key

dict.get(key)函数返回字典中键为key的元素值。

复杂度分析:

  • 时间复杂度:O(n), 遍历整个数组和字典进行了常数次操作。
  • 空间复杂度:O(n), 新生成了一个字典,长度大约为n/2。

总结

这道题最优解就是通过异或运算进行操作,只消耗了O(1)的空间。
哈希表法消耗了更多的空间,没有异或法好。

下面这个方法不消耗空间,但是非常消耗时间,是其他方法的十多倍,删除操作中找到对应元素d应该会很花时间,并且还要不断更新数组,不实用。

class Solution:def singleNumber(self, nums: List[int]) -> int:    while True:d = nums[0]nums.remove(d)try:nums.remove(d)except:return d 

leetcode136---异或运算的交换律相关推荐

  1. 认识异或运算的本质与基本规律,0^x=x,x异或x=0,有交换律,结合律,与顺序无关

    认识异或运算的本质与基本规律,0^x=x,x异或x=0,有交换律,结合律,与顺序无关 提示:异或运算系列文章 非常重要的算法技巧:异或运算!! 为了破解以下这些重要的题目: (2)数组arr中,有一个 ...

  2. 选择排序、冒泡排序、异或运算

    选择排序 数组取数时间复杂度是常数 int a= arr[i] 从数组中获取第i位置的数即获取某个偏移量或距离的数 时间复杂度是一个常数 数组在内存中的地址空间是连续的 所以通过偏移量就可以获取到指定 ...

  3. 经典算法之异或运算(无进位相加)

    目录 异或运算的定义 异或运算的性质 异或运算的应用 交换两数 翻转指定位 寻找单身狗 异或运算的定义 众所周知,计算机中的所有数据都是以二进制(0或者1)的形式存储.而异或运算符(^)就是将参加运算 ...

  4. 数据结构与算法JC班-左程云第一节课笔记(认识复杂度、对数器、二分法与异或运算)

    第1节 认识复杂度.对数器.二分法与异或运算 程序=算法+数据结构,既然算法这么重要,每个人写出来的算法又不一样,那么怎么算是一个好的算法呢? 1.评估算法优劣的核心指标是什么? 时间复杂度(流程决定 ...

  5. 你管这玩意叫异或运算?

    对于底层开发来说,位运算是非常重要的一类操作.而对于位运算来说,最有意思的,应该就是异或运算(XOR)了. 提到异或运算,很多同学可能首先想到的就是一个经典的,和异或运算相关的面试问题: 给你一个包含 ...

  6. 异或运算的基本介绍以及使用技巧,剖析常见的异或题目

    关于异或运算 一.异或运算的基本介绍 二.异或运算的性质 三.异或运算的经典题目 1.题目1 2.题目2 3.题目3 4.题目4 5.题目5 四.异或运算小结 一.异或运算的基本介绍 异或运算,符号为 ...

  7. 异或运算和几个经典题目解析

    认识异或运算 异或运算就记成无进位相加 0 1 1 1 0 1 1 1 0 异或运算满足交换律和结合律 同样一批数,不管选择什么样的顺序做异或运算,最后结果一定是一个 如何不使用额外的变量交换两个数 ...

  8. 算法总结——异或运算

    异或运算 总结总结一些算法,也方便自己回顾,定时更新. 运算规则:相同取0,相异取1 异或算法有三个特征: 1.任何数和0做异或运算,结果仍然是原来的数,即a ⊕ 0 = a. 2.任何数和自身做异或 ...

  9. 异或运算_专题 | 异或运算的一些应用

    点击上方蓝字设为星标 每周一.三.五上午 8:30 准时推送 下面开始今天的学习- 定义 异或是一个数学运算,用于逻辑运算.如果 a.b 两个值不同,则异或结果为 1 ,否则结果为 0 .真值表如下: ...

最新文章

  1. ubuntu mysql 5.7.19_在Ubuntu19下安装Mysql-5.7.24
  2. MyEclipse搭建java Web项目开发环境
  3. python序列类型-python序列类型有哪些
  4. swagger restful api form映射实体对象和body映射实体对象配置
  5. CodeForces - 1326E Bombs(线段树+思维)
  6. SVM分类算法的基本理论问题
  7. LeetCode 长度最小的子数组
  8. 道理与例子【人人都是产品经理:9009】
  9. Atitit poi读取大文件内存溢出的解决 目录 1. poi提供了两种读取excel的方式,一种是类似xml的Dom, 1 2. POI官网上提到XSSF有三种读写excel,POI地址 1 3
  10. 纯干货:LCD屏和OLED屏的区别?手机屏幕材质各有什么区别?
  11. 如何查找并修改CAD图纸中的标注文字?
  12. linux 实时显示网速工具nload
  13. android中数据统计,Android 友盟统计集成
  14. 盘点:QuickTime Player 键盘快捷键和手势大全
  15. mindspore执行 core dump问题
  16. linux认证考试内容,Linux认证考试RHCE大纲
  17. 美国计算机科学奥林匹克竞赛试题acsl,2020年国际数学奥林匹克竞赛试题全部出炉,网友:给答案都看不懂...
  18. 修复:“ Windows进程激活服务(WAS)由于遇到错误而正在停止。”
  19. PTA基础编程题目集 7-20 打印九九口诀表 (15分)
  20. springBoot4S店汽车销售管理系统源码

热门文章

  1. rabbitmq-plugins enable rabbitmq_management Failed to start Elixir.
  2. python编写的用于体检数据的自动计算 比对 出报告的程序
  3. 主机调优20141226
  4. C++ Primer(第四版)答案之第八章
  5. Ubuntu kernel 升级
  6. A Game of Thrones(47)
  7. python杂志订阅系统详细设计_系统详细设计
  8. 可以不学html直接学vue吗,vue一定要学node吗?
  9. Ethercat学习日记
  10. 数控车床加工的工艺与普通车床的加工工艺