题目大意
https://leetcode.com/problems/single-number-ii/
数组中只有一个数出现一次,其它数都出现三次。要求时间复杂度O(n),空间复杂度为O(1)
题目分析
思路参考了这里:http://www.acmerblog.com/leetcode-single-number-ii-5394.html
第一种比较直观的思路是:因为每个数字都有32位,把数组中所有的元素对应位相加,32位中的每一位都可以得到一个和,把这个和模3得到的结果(注意模3的结果只能是0和1,不可能是2)就是答案在该位的值。但这种方法需要频繁地移位操作,虽然时间和空间能满足题目要求。
第二种思路代码更为精简和巧妙,https://discuss.leetcode.com/topic/2031/challenge-me-thx/25 这里利用真值表+状态机解释的,本质上就是用两个bit代表00,01,10这三个状态,然后在这三个状态之间基于某种规则转移。贴一下思路:
|
|
第三种思路就是用三个变量ones,twos,threes直接统在那些位上出现了几次1,参考了这里:https://github.com/soulmachine/leetcode。可以理解成用二进制模拟了三进制加法,思路比较好理解。
代码
第一种思路
|
|
第二种思路
|
|
第三种思路
|
|