Leetcode题目连接:输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了3次。请找出那个只一次的数字。例如,如果输入的数组为[0,1,0,1,0,1,100],则只出现一次的数字是100。
https://leetcode.cn/problems/WGki4K/
分析:所有数字都出现3次那么所有数字的和相加除3余数应为0,类推过来,一个int型整数由32个0/1组成,将所有出现的数字按位数相加,例如所有数字第i个位和为bitsum[i],那么那些出现三次的数字的第i个位和除3应该为0,若除3为0,那么只出现一次的数字的第i个位为0,若除3为1,那么只出现一次的数字的第i个位为1。
Java代码实现:class Solution {
public int singleNumber(int[] nums) {
int[] bitSums = new int[32]; //定义一个数组为所有数字在第i位置的和
for(int num: nums){
for(int i = 0; i <32; i++){
bitSums[i] += (num>>(31-i)) & 1;//num>>31-i让i位置的数为末尾数,与i位与计算得到i位置的值
}
}
int result = 0;
for(int i = 0; i<32; i++){
result = (result<<1) + bitSums[i]%3;//result>>1让末尾数进一个位,腾出最后一位给bitSums[i]%3
}
return result;
}
}
复杂度分析:
时间复杂度:O(n^2)
代码执行结果:
以上为个人做题笔记,很多是自己的理解,若有错误还请各位大佬指出~



