问题描述
题目二:数组中唯一出现一次的数字
在一个数组中除一个数字只出现一次之外,其他数字都出现了三次。请找V户那个只出现一次的数字。
实现
方法:异或思路&取余
// 时间复杂度O(n)
// 不能用异或,可以异或的思路:数字的每一位都出现三次,相加后被3整除
// 余数则为出现1次的
public class C56_array_FindNumberAppearingOnce {
static int findNumOnce(int[] arr) {
int res = 0;
if (arr == null || arr.length == 0) {
return res;
}
int[] bitSum = new int[32];//表示每一位的和
for (int i = 0; i < arr.length; i++) {
int bitMask = 1;
for (int j = 31; j >= 0; j--) {
int bit = arr[i] & bitMask;//判断元素每一位是否是1
if (bit != 0) {
bitSum[j] += 1; //是1就相加
}
bitMask = bitMask << 1;
}
}
for (int i = 0; i < 32; i++) {
res = res << 1;
res += bitSum[i] % 3;//余数即为出现一次的
}
return res;
}
}
Test
public static void main(String[] args) {
int[] arr = {2, 2, 3, 2, 7, 7, 7};
System.out.println(findNumOnce(arr));
}