1.题目描述
给你一个整数数组
nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
示例 1:
输入:nums = [2,2,3,2] 输出:3示例 2:
输入:nums = [0,1,0,1,0,1,99] 输出:99提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums
中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
2.解题思路
把数组中的每一个数字想象成二进制表示,例如nums = [1,1,1,2] = [01,01,01,10]
按照二进制从低位到高位依次统计不同位上 '1'的个数,可以看出如果某一位上 '1'的个数不是3的倍数,那么这一位一定属于出现次数位1的那个数。
于是,只需要遍历nums 32次,依次统计每一位上1的个数,如果不是3的倍数,就把这一位加进ans
3.代码实现
class Solution {public int singleNumber(int[] nums) {int ans = 0;for (int i = 0; i < 32; i++) {int cnt = 0;for (int num : nums) {cnt += (num >> i) & 1;}if (cnt % 3 != 0) {ans |= (1 << i);}}return ans;}
}