LeetCode面试系列 第2天:No.136 - 只出现一次的数

LeetCode面试题题系列的上一篇文章 Leetcode面试系列 第1天:Leetcode 89 - 格雷码 中,我们介绍了 二进制相关 的一个典型题。

今天呢,咱们来聊聊哈希表(字典),这是另一种典型面试题。哈希表实际上就是用内存空间换时间,即消耗额外的一点内存,但可将数据存取的时间大大降低,其时间复杂度几乎是常数时间(O(1))。

比较典型的一个问题是 Leetcode 上第 136 号问题,

Leetcode 136. Single number

在线提交地址: https://leetcode-cn.com/problems/single-number/

题目描述


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

说明:

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

示例 1:

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

  2. 输出: 1

示例 2:

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

  2. 输出: 4


  • 贡献者: LeetCode

  • 题目难度: Easy

相关话题

  • 哈希表

    https://leetcode-cn.com/tag/hash-table/

  • 位运算

    https://leetcode-cn.com/tag/bit-manipulation/

相似题目

  • 只出现一次的数字 II    难度: 中等

    https://leetcode-cn.com/problems/single-number-ii/

  • 只出现一次的数字 III   难度: 中等

    https://leetcode-cn.com/problems/single-number-iii/

  • 缺失数字    难度: 简单

    https://leetcode-cn.com/problems/missing-number/

  • 寻找重复数    难度: 中等

    https://leetcode-cn.com/problems/find-the-duplicate-number/

  • 找不同    难度: 简单

    https://leetcode-cn.com/problems/find-the-difference/


解题思路:

解法1:

使用字典 dict 存储每一个整数出现的次数,如果当前数在 dict 中不存在,则添加之,出现的次数设置成1,否则每再出现一次,次数加1。最后从里面挑出第一个出现次数为1的 KeyValuePair 的 Key 值即可。

解法2:

使用按位异或

由于异或操作^具有如下几个性质:

  • a^a = 0

  • a^0 = a

  • a^b = b^a

那么,将原 nums 数组里的所有数进行按位异或,每两个相等的数都异或为 0 而抵消了,最后剩下的数与 0 异或得到的是它本身,即为只出现过一次的数。

方法1的已 AC 代码(Python 3):

  1. class Solution:

  2. def singleNumber(self, nums: List[int]) -> int:

  3. res = 0

  4. d = dict()

  5. for num in nums:

  6. if num not in d:

  7. d[num] = 1

  8. else:

  9. d[num] += 1

  10. res = next(k for k, val in d.items() if val == 1)

  11. return res

如果需要在本地测试,需要先在代码开头引入 fromtypingimportList。完整代码如下:

  1. from typing import List

  2. class Solution:

  3. def singleNumber(self, nums: List[int]) -> int:

  4. res = 0

  5. d = dict()

  6. for num in nums:

  7. if num not in d:

  8. d[num] = 1

  9. else:

  10. d[num] += 1

  11. res = next(k for k, val in d.items() if val == 1)

  12. return res

  13. #以下是测试

  14. sol = Solution()

  15. print(sol.singleNumber([6, 4, 6, 2, 4]))

运行结果:

执行用时: 104ms, 在所有 Python3 提交中击败了 43.71%的用户。

方法2的已 AC 代码(Python 3):

  1. class Solution:

  2. def singleNumber(self, nums: List[int]) -> int:

  3. r = 0

  4. for i in nums:

  5. r ^= i

  6. return r

如果需要本地测试,其方法与 方法1 类似,只需要替换 class 部分即可。

运行结果:

执行用时: 84ms, 在所有 Python 3 提交中击败了 99.96%的用户。

显然,对于此题, 位运算依然更胜一筹。

系列文章
(0)

相关推荐

  • 【Python面试】 说说Python中有几种数据类型?​

    最近公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开 ...

  • 自学算法?这几个网站和工具你挑一个吧

    学习算法这么些年,从小白到大白,今天给大家推荐几个私藏的自学算法与数据结构的网站和工具. LeetCode 这是一个美国在线编程刷题网站,早几年国外知名IT企业如Facebook.Google等考察算 ...

  • ​LeetCode刷题实战152:乘积最大子数组

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • ​LeetCode刷题实战283:移动零

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • (1条消息) 漫画:位运算系列篇(只出现一次的数字

    今天是小浩算法"365刷题计划"第63天.今天状态不好,因为昨天感冒了,写了好久才写下这篇长文,本来说写点别的水一水,改天再做这个续集,但是想了想还是算了!昨天我们在"除 ...

  • ​LeetCode刷题实战18: 四数之和

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • Leetcode面试系列 第1天:Leetcode 89 - 格雷码

    最近,打算花点时间写个 Python 解决 Leetcode 题的系列文章~ 大家是否还记得电影黑客帝国中的数字雨林的场景?事实上,计算机底层数据的存储和运算都是二进制的,因而面试题环节中面试官也经常 ...

  • LeetCode面试系列 第3天:No.67 - 二进制数求和

    大家都知道 LeetCode 中的第一道题是 Two Sum,比较简单.我们今天决定挑一个与之类似,但难度稍大于之的问题 二进制之和来分析,其中涉及到的主要知识是 Python 中的 进制转换,比如后 ...

  • LeetCode面试系列 第4天:No.202 - 快乐数

    或许你不知道的是,Leetcode 中是有很多 数学题 的,本文要解析的题 快乐数 就是其中到一个典型问题,本题将基于数据结构 set 来求解. 今天要给大家分析的面试题是 LeetCode 上第 2 ...

  • LeetCode面试系列 第5天:No.204 - 统计质数

    在上篇算法题的文章中,我们介绍了 LeetCode 中的一道数学题 - 快乐数 .今天,我们来聊聊质数(英文是Prime,也称为素数)相关的面试题.以前很多编程书上会有个经典问题,即判断一个数是否是质 ...

  • LeetCode面试系列 第6天:No.9 - 回文数

    上一篇面试题中,我们使用了 埃拉托斯特尼筛法 去统计给定范围内质数的个数(LeetCode No.204),还是有点烧脑的.今天我们来分析一道相对轻松的字符串面试题吧,恰好大家从Python 100天 ...

  • LeetCode面试系列 第7天:No.13 - 罗马数字转整数

    上一篇 LeetCode 面试题中,我们分析了一道轻松的字符串面试题 - 回文数.今天我们来分析一道将数学和字符串结合起来的的面试题. Leetcode 今天要给大家分析的面试题是 LeetCode ...

  • LeetCode面试系列 第8天:No.58 - 最后一个单词的长度

    上一篇 LeetCode 面试题中,我们分析了一道将数学和字符串结合起来的的面试题,今天我们再来分析了一道轻松的字符串面试题吧~ Leetcode 今天要给大家分析的面试题是 LeetCode 上第 ...

  • LeetCode面试系列 第9天:No.345 - 反转字符串中的元音字母

    上一篇 LeetCode 面试题中,我们分析了一道相对轻松的字符串面试题 - 最后一个单词的长度.今天,我们接着来看另一道字符串的算法题吧. Leet code 今天要给大家分析的面试题是 LeetC ...

  • LeetCode面试系列 第10天:No.976 - 三角形的最大周长

    上一篇 LeetCode 面试题中,我们分析了一道字符串的算法题 - 反转字符串中的元音字母,今天我们来分析一道简单的几何题吧. Leetcode 今天要给大家分析的面试题是 LeetCode 上第 ...