题目描述:有N个不同的数,分别是1到N,在随机打乱顺序的过程中,出现了一点小误差,多了一个数该数也在1到N之间(包含)。请你找出这个数,要求时间复杂度是O(N),辅助空间O(1),这意味除原始数据外,不能使用数组、map、set、vector等。
输入:
第一行一个整数N
第二行N+1个数ai(1<=ai<=N),其中多了一个,数之间有一个空格。(N<2000)
输出:
多出的这个整数
输入样例:
5
3 1 3 5 2 4
输出样例:
3
对这道题来说可以使用异或来解决,首先讲讲什么是异或。
异或是一种运算,在二进制的视角之下,有相同则0,不同则1的性质。
同时,异或满足交换律。a^b^c^d = a^d^b^c。
知道了这种性质,便可以开始解决问题了。步骤如下:
- 取x=0。用x去异或1-N的每一个数,可以得到一个预期异或值
- 得到预期异或值后,去异或数组中的每一个元素。
这样的原理是什么呢?其实很简单。当数组中没有重复元素时,预期异或值为1^2^3…^N。之后再去异或待判断数组中的元素,可得 (1^2^3^…^N) ^ x = 多出的元素。