LeetCode 面试题56 - I. 数组中数字出现的次数 | Python
面试题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的更多相关文章
- 力扣Leetcode 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- 《剑指offer》面试题56 - I. 数组中数字出现的次数
问题描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 1: 输入:nums = [4,1 ...
- 《剑指offer》面试题56 - II. 数组中数字出现的次数 II
问题描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
- 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或
剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II
题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...
- 剑指 Offer 56 - I. 数组中数字出现的次数
题目描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是\(O(n)\),空间复杂度是\(O(1)\). 示例1: 输入:nums ...
- 【位运算】剑指offer 56. 数组中数字出现的次数
这是一系列位运算的题目,本文将由浅入深,先从最简单的问题开始: 问题1: 一个数组中只有一个数字出现过1次,其余数字都出现过两次,请找到那个只出现1次的数字.要求时间复杂度是 \(O(n)\),空间复 ...
随机推荐
- iOS 第三方库
网络 AFNetworking HTTP网络库 Reachability 网络监测 UI.布局 Masonry AutoLayout SnapKit AutoLayout Swift TOWebVie ...
- 模块 random 随机
random 随机数 0 导入 >>> import random 1 random 随机小数 random.random() # 大于0且小于1之间的小数 0.7664338663 ...
- vscode 保存自动 格式化eslint 代码
在网上找了很多种方法,大多都没有成功 一下是一种成功的 配置方法: 1) First, you need to install the ESLint extension in the VS code ...
- 配置HTTPS网站服务器
配置HTTPS网站服务器 案例1:配置安全Web服务 1.1问题 本例要求为站点http://server0.example.c ...
- 基于redis的订单号生成方案
目前,比较火的nosql数据库,如MongoDB,Redis,Riak都提供了类似incr原子行操作. 下面是PHP版的一种实现方式: <?php /** * 基于Redis的全局订单号id * ...
- Github基础使用教程 ———功能介绍
Github基础使用手把手教程 --功能介绍 本人Github小白,刚摸索的差不多,记录一下经验,小白写出来的东西各位萌新一定看的懂啦~ 本篇内容主要针对想快速学会使用Github这个强大工具的 ...
- 微信小程序template富文本插件image宽度被js强制设置
这段时间一直做微信小程序,过程中遇到了一个问题,这个问题一直没有得到完美的解决. 问题描述: 在Web编程中经常会引入template插件,这个插件是封装好,我们通常的做法是直接引入,配置简单,好用, ...
- Vulnhub DC-8靶机渗透
信息搜集 nmap -sP 192.168.146.0/24 #主机发现 nmap -A 192.168.146.146 #Enable OS detection, version detection ...
- spring06
主要是学会spring中关于通过注释来配置bean. 以及处理怎样智选其一或者补选某一个bean还有就是关于当出现多个相同的bean的时候怎样配置: 具体的代码和配置文件如下: <?xml ve ...
- flask 入门 之 Python Shell (一)
1.安装插件: pip install flask_script 2.代码: #encoding:utf-8 from flask_sqlalchemy import SQLAlchemy from ...