题目

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:

输入:nums = [3,4,3,3]
输出:4
示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

限制:

1 <= nums.length <= 10000
1 <= nums[i] < 2^31

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  1. 有限状态自动机

…数点状态转移方程推导.

  1. 统计二进制位

将数组中所有数的二级制位加起来,如果能被3整除,说明该位置出现过三次,不符合,不能被3整除的位置位答案的二进制位

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var singleNumber = function (nums) {
  6. const bin = new Array(32).fill(0)
  7. for (let n of nums) {
  8. for (let i = 31; i >= 0; i--) {
  9. if (n > 0) {
  10. if (n & 1 === 1) {
  11. bin[i] += 1
  12. }
  13. n >>= 1
  14. } else {
  15. continue
  16. }
  17. }
  18. }
  19. let res = 0
  20. for (let i = 31; i >= 0; i--) {
  21. if (bin[i] % 3 != 0) {
  22. res += 2 ** (31 - i)
  23. }
  24. }
  25. return res
  26. };