题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
样例
输入: [2,2,3,2]
输出: 3
输入: [0,1,0,1,0,1,99]
输出: 99
算法分析
- 考虑每个数二进制某一位上出现
1
的次数,如果出现1
的次数为3k + 1
,则证明只出现一次的数这一位是1
参考 起船起床学习啦同学的解析
时间复杂度 $O(32 n)$
Java 代码
class Solution {
public int singleNumber(int[] nums) {
int n = nums.length;
int ans = 0;
// 考虑每个数二进制某一位上出现 1 的次数,如果出现 1 的次数为 3k + 1,则证明只出现一次的数这一位是 1
for(int bit = 0;bit < 32;bit ++)
{
int cnt = 0;
for(int i = 0;i < n;i ++)
{
if((nums[i] >> bit & 1) == 1) cnt ++;
}
if(cnt % 3 != 0) ans += 1 << bit;
}
return ans;
}
}
佬,你这个解析的链接是链向自己的😦