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

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

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


image.png


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


相关话题



相似题目






解题思路:

解法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. classSolution:
  2.    def singleNumber(self, nums:List[int])-> int:
  3.        res =0
  4.        d = dict()
  5.        for num in nums:
  6.            if num notin 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 importList

  2. classSolution:
  3.    def singleNumber(self, nums:List[int])-> int:
  4.        res =0
  5.        d = dict()
  6.        for num in nums:
  7.            if num notin 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. classSolution:
  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%的用户。


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

目录
相关文章
|
4月前
|
开发者 索引 Python
这些年背过的面试题——LeetCode
本文是技术人面试系列LeetCode篇,一文带你详细了解,欢迎收藏!
|
6月前
|
存储 算法 数据挖掘
深入解析力扣168题:Excel表列名称(进制转换法详解及模拟面试问答)
深入解析力扣168题:Excel表列名称(进制转换法详解及模拟面试问答)
|
6月前
|
存储 算法 数据挖掘
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
|
6月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
6月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣164题:最大间距(桶排序与排序方法详解)
【模拟面试问答】深入解析力扣164题:最大间距(桶排序与排序方法详解)
|
5月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
5月前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
|
5月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
6月前
|
SQL 算法 大数据
深入解析力扣176题:第二高的薪水(子查询与LIMIT详解及模拟面试问答)
深入解析力扣176题:第二高的薪水(子查询与LIMIT详解及模拟面试问答)
|
6月前
|
算法 数据挖掘 大数据
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)