题目
数组中除一个数字只出现一次外,其他数字都出现了三次,请找出这个唯一只出现一次的数字。
思路
思路一
使用排序的方法,排序后遍历排序后的数组。时间复杂度为O(nlgn).
思路二
使用哈希表,时间复杂为O(n),但是需要空间复杂度也为O(n)
思路三
由于每个数字都出现了三次,而同一个数字每一位上的值都相同,可以分别把所有数字的每一位上的数字加起来(不含进位),每一位的和余3后的值就是该数字的二进制表示。
代码
public static int findNumberAppearingOnce(int[] datas){
int length = datas.length;
int[] number = new int[32];
for(int i = 0;i < number.length;i++)number[i] = 0;
for(int i = 0;i < length;i++){
int bitMask = 1;
for(int j = 31;j >= 0;j--){
int bit = datas[i] & bitMask;
if(bit != 0)number[j] += bit;
bitMask = bitMask << 1;
}
}
int result = 0;
for(int i = 0;i < 32;i++){
result = result << 1;
result += (number[i] % 3);
}
return result;
}
总结
数组总只出现几次的数字这类题,除了使用排序的方法,还可以使用哈希表和位运算。
位运算的效率更高,所以应该熟悉位运算的规律。