剑指 Offer 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.length <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
代码实现
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int diff = 0;
for(auto nt = nums.begin(); nt != nums.end(); nt++)
diff ^= (*nt);
int flag = diff & (-diff);
vector<int> result(2, 0);
for(auto nt = nums.begin(); nt != nums.end(); nt++) {
if((*nt) & flag)
result[0] ^= (*nt);
else
result[1] ^= (*nt);
}
return result;
}
};
思路解析
- 题目的重点是要时间复杂度\(O(n)\),空间复杂度\(O(1)\),考虑位运算的方式;
- 基本的位运算逻辑:
- 使用逻辑异或(\(\oplus\))来区分未成对出现的数字
\(0 \oplus 0 = 0\),\(0 \oplus 1 = 1\); - 逻辑异或(\(\oplus\))运算满足结合律和交换律;
因此,对所有的数字进行异或运算,由于只有两个数字(假设为\(a\)和\(b\))未重复出现,则异或运算的结果是\(a\oplus b\)。
\(a_1 \oplus a_1 \oplus a_2 \oplus a_2 \oplus \cdots a_n \oplus a_n \oplus k = k\)
- 使用逻辑异或(\(\oplus\))来区分未成对出现的数字
- 得到\(a\oplus b\)后,我们需要想一个办法来将
nums
分组,考虑所有的数字都可以用二进制表示,则可根据某一位是\(0\)或\(1\)来对nums
进行分组,且要保证\(a\)和\(b\)不在同组,采用的分组方式如下:
- 在计算机中,整形数字采用补码的形式表示,正数的补码等于其原码,负数的补码等于其反码+1,以8位
int
类型为例:
int s = 8
,原码00000100
,反码00000100
,补码00000100
int s =-8
,原码10000100
,反码11111011
,补码11111100
- 可知:
s & (-s) = 00000100
,仅有1位数字为\(1\)(s
的最低位\(1\)),且s
本身的该位数字也为1,可利用这一特性,对原数组nums
进行分类。 - 如何确保\(a\)和\(b\)不在同一分组?
已知\(d = a\oplus b\),则\(d\)的最低位\(1\)一定可以区分\(a\)和\(b\)(异或运算的定义)
则根据\(d\)的某一位\(1\)对原数组进行分组,必定可保证\(a\)和\(b\)不同组。
- 在计算机中,整形数字采用补码的形式表示,正数的补码等于其原码,负数的补码等于其反码+1,以8位
- 分组之后的事情就简单了,由于异或运算满足结合律和交换律,且相同的数字一定被分在的同一组,而\(a\)和\(b\)不同组,对每一组分别进行异或运算,最后两组得到的结果就分别是\(a\)和\(b\)。
剑指 Offer 56 - I. 数组中数字出现的次数的更多相关文章
- 剑指 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》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...
- 【剑指Offer】旋转数组中的最小数字 解题报告(Python)
[剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- LeetCode 面试题56 - I. 数组中数字出现的次数 | Python
面试题56 - I. 数组中数字出现的次数 题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). ...
- 力扣Leetcode 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- 【剑指offer】03.数组中重复的数组
剑指 Offer 03. 数组中重复的数字 知识点:数组:哈希表:萝卜占坑思想 题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些 ...
随机推荐
- GitHub/Git配置与简单的使用
今天我开始了初步的学习,首先从陌生的开始下手,GitHub,自己通过查询网络上的资料有了初步的理解与认识.进行了Git与GitHub的配置. 一.前期准备 首先下载Git,Git官网->http ...
- canvas小画板——(2)荧光笔效果
我们在上一篇文章中讲了如何绘制平滑曲线 canvas小画板——(1)平滑曲线. 透明度实现荧光笔 现在我们需要加另外一种画笔效果,带透明度的荧光笔.那可能会觉得绘制画笔的时候加上透明度就可以了.我们来 ...
- C#LeetCode刷题之#257-二叉树的所有路径(Binary Tree Paths)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4082 访问. 给定一个二叉树,返回所有从根节点到叶子节点的路径. ...
- C#LeetCode刷题-字符串
字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) ...
- jquary常见问题总结
如何调用本地json 1. 调用 <script src="solution.json?cb=readData"></script> 2. json 修改 ...
- myBatis源码解析-配置文件解析(6)
前言 本来打算此次写一篇关于SqlSession的解析,但发现SqlSession涉及的知识太多.所以先结合mybatis配置文件(我们项目中常写的如mybatisConfig.xml),来分析下my ...
- Jmeter 常用函数(27)- 详解 __env
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 获取环境变量的值 语法格式 ${__e ...
- Mybatis入门(四)------联表查询
Mybatis联表查询 一.1对1查询 1.数据库建表 假设一个老师带一个学生 CREATE TABLE teacher( t_id INT PRIMARY KEY, t_name VARCHAR(3 ...
- tp6 不能使用vendor
从thinkphp 5.1.x后vendor的使用方法发生变化,文档又没有详细说明.官方真的太坑了! 在thinkPHP 5.1.X后新版取消了Loader::import方法以及import和ven ...
- 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!
写在前面 在实际的企业开发环境中,往往都会将环境分为:开发环境.测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境.测试环境和生产环境是互不相通的.在以前的开发过程中,如果开发人员 ...