谁替换了谁题目描述:有N个不同的数分别是1到N在随机打乱顺序的过程中出现了一点小误差其中一个数换成了另一个数。请你找出谁替换了谁要求时间复杂度是ON辅助空间O1这意味不能使用数组、map、set、vector等。输入:N个数ai1=ai=N其中缺了一个而又有一个数出现了2次其它都出现了1次数之间有一个空格。N2000输出:两个整数a和ba是缺的哪一个b是出现两次的那一个中间有一个空格没有回车输入样
分析:
这道题很巧妙,如果你不知道其思路,很难想到这个解法。
首先,对于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/ckVw 著作权归作者所有。请勿转载和采集!