剑指 Offer II 004. 只出现一次的数字
题目描述
给你一个整数数组 nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 **三次 。**请你找出并返回那个只出现了一次的元素。
示例
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,100]
输出:100
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
进阶:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
思路解析
1.每个数都出现三次,只有一个数是出现了一次,那么对32位二进制位进行统计次数
2.如果当前位置的二进制的1出现的次数不是3的倍数次,说明那个多出来的数在这一位占了有效位置
3.积累有效位置然后进行累加
代码实现
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i = 31;i>=0;i--) {
int cnt = 0;
for(int num : nums) {
if(((num>>i)&1)==1) cnt++;
}
if(cnt%3==1) res+=(1<<i);
}
return res;
}
}
欢迎大佬们关注小弟的博客https://blog.csdn.net/qq_41522089