题目
在一个数组 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
解题思路
1.对于这道题我们考虑数字的二进制形式,对于出现三次的数字,各 二进制位 出现的次数都是3 的倍数。因此,统计所有数字的各二进制位中 1 的出现次数,并对 3 求余,结果则为只出现一次的数字。
举个栗子:
2.因此我们需要设置一个数组 arr[ ] 来记录我们数组中的所有数字各个二进制位上 1 出现的次数, 变量 m 用来寻找二进制位为 1 的位数,变量 sum 用来保存最终的结果,我们用两个 for 循环去遍历数组 nums ,第一次循环先去判断数组中所有数字的二进制位的最低位,只有最低位为 1 时与m = 1进行与运算后结果才不为0,我们将所有最低位为 1 的数的个数统计到arr[i]中。
3.然后用arr[i] 对 3 取余,并将结果乘以 m后存放在sum中,然后再将m向左移一位变为m = 10,去统计二进制的第二位为 1 的数字的个数,以此类推,直到所有位数统计完成,返回sum即可。
代码实现
class Solution {
public int singleNumber(int[] nums) {
int[] arr = new int[32];
int m = 1;
int sum = 0;
for(int i = 0; i < 32; i++){
for(int j = 0; j < nums.length; j++){
if((nums[j] & m) != 0 ){
arr[i]++;
}
}
arr[i] = arr[i] % 3;
sum = sum + arr[i] * m;
m = m << 1;
}
return sum;
}
}
测试结果