面试难题:O(N)找数组缺失的两个数

需积分: 5 0 下载量 76 浏览量 更新于2024-08-03 收藏 455KB PDF 举报
面试题“消失的两个数字”是一道经典的编程问题,来源于LeetCode的面试题库,旨在考察候选人在处理范围受限、缺失数据的数组时的算法设计和优化能力。原题目17.19的升级版是17.04的消失的数字题目,这表明该题目有一定的递进难度。 题目的核心任务是在给定的数组中,该数组包含从1到N的所有整数,但是缺少两个数字,要求在O(N)的时间复杂度和O(1)的空间复杂度下找出这两个缺失的数字。输入数组`nums`的大小为`numsSize`(等于N-2),并且通过函数`missingTwo`获取缺失的数字,并通过`returnSize`返回缺失数字的数量(即2)。 分析过程分为两部分: 1. **方法一(暴力法)**: - 由于数组的范围已知为1到N,可以创建一个长度为30000的整型数组`arr`,这是因为题目中给出的最大限制是30000。 - 使用`while`循环遍历输入数组,对于每个`nums[i]`,在`arr[nums[i]]`位置标记1。循环条件是次数小于`numsSize`。 - 遍历完成后,再次遍历`arr`数组,从1到`numsSize + 2`,查找连续的两个值为0的元素,这两个元素的下一个数字就是缺失的两个数。 2. **方法二(位运算)**: - 采用异或操作(XOR)来解决此问题。因为任何数字与它自身进行异或都是0,所以数组中的所有元素与所有元素进行异或后,结果应该是两个缺失数字的异或。 - 初始化一个变量`result`为0,然后对数组中的所有元素进行异或操作,`result`将保留两个缺失数字的异或值。 - 接着,对于数组中的每一个元素`nums[i]`,计算`result`与`nums[i]`异或的结果,再与当前的`result`进行异或,这样每次操作都会消除其中一个缺失数字的痕迹。 - 最终,`result`中剩下的就是两个缺失数字的异或值。将`result`除以2并向下取整,得到第一个缺失数字;然后用`result`加上第一个缺失数字,再除以2,向下取整得到第二个缺失数字。 在解答此类题目时,理解题意、分析问题的关键点(如范围、缺失数目的确定等)、选择合适的算法(暴力法或利用特性如位运算)以及优化时间复杂度和空间复杂度至关重要。掌握这些技能不仅有助于面试中的表现,也能提高日常编程的效率。