【题目描述】
Given an array contains N numbers of 0 ..N, find which number doesn‘t exist in the array.
给出一个包含 0 ..N中N个数的序列,找出0 ..N中没有出现在序列中的那个数。
【题目链接】
www.lintcode.com/en/problem/find-the-missing-number/
【题目解析】
最直观的思路是对数据进行排序,然后依次扫描,便能找出漏掉的数字,但是基于比较的排序算法的时间复杂度至少是nlog(n),不满足题目要求。
一种可行的具有线性时间复杂度的算法是求和。对0到n求和,然后对给出的数组求和,二者之差即为漏掉的数字。但是这种方法不适用于0是漏掉的数字的情况,因为此时两个和是相同的。(或者也能由此得出漏掉的数字是0)
从CPU指令所耗费的时钟周期来看,比加法更高效率的运算是异或(XOR)运算。本题的标签里有位运算,暗示本题可以用位运算的方法解决。
异或运算的一个重要性质是,相同的数异或得0,不同的数异或不为0,且此性质可以推广到多个数异或的情形。本题的解法如下,首先将0到n这些数进行异或运算,然后对输入的数组进行异或运算,最后将两个结果进行异或运算,结果便是漏掉的数字,因为其他数字在两个数组中都是成对出现的,异或运算会得到0。
【参考答案】