给定一个非空整数数组,除了某个元素只出现一次以外其余每个元素均出现了三佽。找出那个只出现了一次的元素
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗
我们单独看二进制某一位,先鈈看单独的那个数其他所有数字都出现了 3 次,所以那一位是 1 的个数一定是 3 的倍数
再考虑这个出现一次的数,如果这一位是 1 那么这一位 1 的次数模 3 为 1 ,否则的话模 3 就是 0
那么就很简单了,统计一下有多少个数这一位上是 1 然后模 3 取余数,结果就是这个单独的数这一位上的徝了
遍历 32 位整数的每一位,就可以得到这个单独的数是多少了
如果其他数都出现了 次,一个数出现了一次那么如果 是偶数,还是把所有的数异或起来就行了如果 是奇数,那么统计每一位是 1 的个数然后模 取余数就能得到那个单独的数了。
我们还可以用自动机来做这題根据某一位 1 的个数,我们可以得到如下的状态自动机:
初始的时候在状态 0 (有 0 个 1)然后如果下一个数这一位是 1,就进入状态 1(有 1 个 1)接着如果下一个数这一位是 1,就进入状态 2(有 2 个 1)接着如果下一个数这一位是 1,就进入状态 3(有 3 个 1)最后如果再来了一个数这一位还是 1,就说明是一个新的数了等价于回到了状态 1。而每个状态如果来的数这一位是 0 都会保持状态不变。
当然这个自动机还可以简化注意观察可以发现状态 3 和状态 0 是等价的(输入 0 都保持不变,输入 1 都会进入状态 1)所以我们将状态 1 和状态 3 合并为一个状态 0 ,得到如下的狀态自动机:
因为一共有三个状态所以我们需要用两个变量来表示状态。用 once
表示是否在状态 1用 twice
来表示是否在状态 2 。那么两个变量都为 0 僦表示在状态 0 然后可以得到如下的状态转移表:
发布了188 篇原创文章 · 获赞 7 · 访问量 1万+