异或算法
最近碰到很多通过巧妙着运用 位运算 来巧妙解决复杂问题的算法,今天分享的这道题,或许能够开拓你的一些算法思维。 题目描述 有一组存放 ID 的数据。并且 ID 取值为 0 - (N-1) 之间,其中只有一个 ID 出现的次数为 1,其他的 ID 出现的次数都等于 2,问如何找到这个次数为 1 的 ID ? 解法一:巧用数组下标 不知道有多少人还记得我之前分享的 巧用数组下标 的技巧: 一些常用的算法技巧总结 。 我的第一想法便是采用 下标法 来解决,把 ID 作为数组 arr 的下标,在遍历 ID 的过程中,用数组记下每个 ID 出现的次数,即每次遍历到 ID = n,则 arr[n]++。 之后我们在遍历数组 arr,找到 arr[n] = 1 的ID,该下标 n 便是我们要寻找的目的 ID。 这种方法的时间复杂度为 O(N),空间复杂度为 O(N)。 解法二:巧用哈希表 显然时间复杂度是无法再降低的了,因为我们必须要遍历所有的 ID,所以时间复杂度最少都得为 O(N)了,所以我们要想办法降低空间复杂度。 大家想一个问题,假如我们检测到某个 ID 已经出现了 2 次了,那么这个 ID 的数据我们还需要存储记录吗?大部分的 ID 都出现了 2 次,这一大部分的数据真的需要存储吗? 答是不用的,因为出现 2 次的 ID 不是我们所要找的。所以我们可以优化 解法一 ,我们可以采用