面试题56 - I. 数组中数字出现的次数


题目


一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]

示例 2:

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

限制:

  • 2 <= nums <= 10000

解题思路


思路:异或,位运算

先说下异或的性质:二进制位同一位相同则为 0,不同则为 1。

再说说一下异或的规律:

  • 若两数值相同,两者的异或结果为 0,(即是任何数与自身异或结果为 0)
  • 任何数与 0 异或结果为本身

同时异或是满足交换律,结合律的(数学符合:⊕)

  • 交换律: a ⊕ b = b ⊕ a
  • 结合律: a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c

回来看本题,题目说明,【整型数组 nums 中,除两个数字之外,其他数字都出现了两次】。那么根据交换律、结合律将相同数字进行异或运算,那么相同数字都会变为 0,再根据第二条规律,那么剩下的出现一次的数字。

在这里主要需要实现的如何确保将数组分成两组,使得:

  • 只出现一次的数字,在不同的两组;
  • 相同的数组出现在相同的组。

只有这样,每组进行异或运算的时候,最终才会剩下单独的数字。那么该如何进行分组?特别是如何将两个不同的数字分到不同的组?

具体实现代码如下。

代码实现


class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
res = 0
# 全员进行异或
for num in nums:
res ^= num # 找出不为 0 的最低位
# & 位运算的使用
div = 1
while (div & res == 0):
div <<= 1 # 进行分组
p, q = 0, 0
for num in nums:
if num & div:
p ^= num
else:
q ^= num return [p, q]

实现结果



以上就是使用异或,位运算的思路,解决《面试题56 - I. 数组中数字出现的次数》问题的主要内容,题目主要的难度在于如何对数组进行分组,然后根据异或的规律性质进行求解。


欢迎关注微信公众号《书所集录》

LeetCode 面试题56 - I. 数组中数字出现的次数 | Python的更多相关文章

  1. 力扣Leetcode 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  2. 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  3. 《剑指offer》面试题56 - I. 数组中数字出现的次数

    问题描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 1: 输入:nums = [4,1 ...

  4. 《剑指offer》面试题56 - II. 数组中数字出现的次数 II

    问题描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums ...

  5. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  6. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  7. 剑指 Offer 56 - II. 数组中数字出现的次数 II

    题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...

  8. 剑指 Offer 56 - I. 数组中数字出现的次数

    题目描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是\(O(n)\),空间复杂度是\(O(1)\). 示例1: 输入:nums ...

  9. 【位运算】剑指offer 56. 数组中数字出现的次数

    这是一系列位运算的题目,本文将由浅入深,先从最简单的问题开始: 问题1: 一个数组中只有一个数字出现过1次,其余数字都出现过两次,请找到那个只出现1次的数字.要求时间复杂度是 \(O(n)\),空间复 ...

随机推荐

  1. TCP 的断包和粘包

    以太网中存在一个对于帧的有效数据大小的限制,即 MTU,以太网的 MTU 为 1500 字节. 一.断包 就是说发送端一次发送的消息长度过大,如果超过了 MTU,那么 ip 会对其进行分片. 在网络编 ...

  2. 医学图像dcm2d切片文件转3dnii文件

    安装 conda: conda install -c conda-forge dicom2nifti pip: pip install dicom2nifti 更新 conda: conda upda ...

  3. reuire代码优化之:r.js

    r.js是requireJS的优化(Optimizer)工具,可以实现前端文件的压缩与合并,在requireJS异步按需加载的基础上进一步提供前端优化,减小前端文件大小.减少对服务器的文件请求.要使用 ...

  4. .NET Core 3.1 的REST 和gRPC 性能测试

    看到越南小哥 的github 上的Evaluating Performance of REST vs. gRPC , 使用的是.NET Core 3.0 , 今天我把它升级到.NET Core 3.1 ...

  5. 经常登录Linux,用户密码背后的知识了解一下

    一,用户密码存放在哪里? 说到这个问题,绝大部分的同学肯定都知道/etc/passwd这个文件,不错,这个文件里存储的就是用户名,密码等信息. 每一行都是一个account,每一行有7个信息,分别用 ...

  6. Wireshark的使用(抓包、过滤器)

    Wireshark的使用(抓包.过滤器) 听语音 分步阅读 Wireshark这个转包工具的简单实用 工具/原料 Wireshark软件包 方法/步骤 Wireshark是世界上最流行的网络分析工具. ...

  7. MariaDB使用数据库查询《三》

                                                                 MariaDB使用数据库查询 案例5:使用数据库查询 5.1 问题 本例要求配 ...

  8. Vue+Element Table 列标红

    效果图 列方法 调用 样式

  9. 初识docker与理解

    因最近公司的一个新项目,有一个业务场景是需要给多个甲方的服务器配置运行环境与部署,所以考虑使用docker来实现环境配置的统一 1.docker是什么 docker是一种容器虚拟化技术的实现,相当于在 ...

  10. 开学java的初步考试

    //第一个.java文件 package project1; //20183777 温学智 信1805-2 public class ScoreInformation { private String ...