分析:

这道题很巧妙,如果你不知道其思路,很难想到这个解法。

首先,对于 n 个数,他们的和是固定的,n 个数中,有一个数缺失,有一个数重复,那么这个重复的数,就是原来缺失的那个数加上多出来的数。所以,我们先求出 1 到 n 的和,再减去 n 个数的和,得到的就是缺失的那个数和多出来的数的和。

接下来,我们要通过一些技巧,将这两个数求出来。因为我们不能用数组、map、set、vector 等,所以,我们只能通过一些算法手段,来求出这两个数。

我们把所有的数都异或起来,得到的结果是 a^b,其中 a 和 b 分别是缺失的那个数和多出来的数。因为 a 和 b 不相同,所以异或的结果中,至少有一位是 1,我们只需要找到这个位置,就可以把 a 和 b 区分开来。

找到这个位置的方法:我们把 a^b 的结果的二进制表示中,最右边的 1 找出来,这个 1 的位置是第 n 位,那么,我们就可以通过把所有数的第 n 位是 1 的数异或起来,得到 a 或者 b,剩下的那个数再和 a^b 异或一下,就得到另外一个数了。

寻找替换的数字:线性时间复杂度算法

原文地址: https://www.cveoy.top/t/topic/ntIz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录