Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
通用做法,统计每一位当中,1出现的次数.
在统计了所有数各个位置上1的出现次数之后, 如果一个数出现了1次, 其他的数全都出现了3次, 这个数的有1的位置上, 1出现的次数肯定为 3 * n + 1, n为任意数. 所以count[i] % 3
就获取了当前位置的bit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public int singleNumberII(int[] A) { int[] count = new int[32]; for (int n : A) { for (int i = 0; i < 32; i++) { count[i] += (n >> i) & 1; } } int ans = 0; for (int i = 0; i < 32; i++) { ans = ans | ((count[i] % 3) << i); } return ans; }
|
另外一种通用做法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public int singleNumber(int[] nums) { int a = 0; int b = 0; for (int c : nums) { int ta = (~a & b & c) | (a & ~b & ~c); b = (~a & ~b & c) | (~a & b & ~c); a = ta; } return a | b; }
|
Ref: https://discuss.leetcode.com/topic/22821/an-general-way-to-handle-all-this-sort-of-questions
Best one
1 2 3 4 5 6 7 8
| public int singleNumber(int[] nums) { int ones = 0, twos = 0; for (int i = 0; i < nums.length; i++) { ones = (ones ^ nums[i]) & ~twos; twos = (twos ^ nums[i]) & ~ones; } return ones; }
|
Ref: https://discuss.leetcode.com/topic/2031/challenge-me-thx