56(2)-数组中数字出现的次数
小于 1 分钟
在一个数组
nums
中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
对于出现三次的数字,二进制是一样的,二进制相应的位数相加一定是3,比如011,按照位数相加是033。那么我们可以将所有数字的二进制相加,不进位,然后对每一位对3求余,剩下的就是出现一次数字的二进制表示,这个可以扩展到其他数字出现若干次的问题。
public int singleNumber(int[] nums) {
int[] data = new int[32];
for (int num : nums) {
int m = 1;
for (int i = 31; i >= 0; i--) {
if((num & m ) == m){
data[i]++;
}
m = m << 1;
}
}
for (int i = 0; i < 32; i++) {
data[i] = data[i] % 3;
}
int result = 0;
// for (int i = 31; i >= 0; i--) {
// int value = data[i] == 0 ? 0 : data[i] * (int)Math.pow(2,31 - i);
// result += value;
// }
//位运算性能好
for (int i = 0; i < 32; i++) {
result <<= 1;
result |= data[i];
}
return result;
}