因为除了出现一次的那个数,其他数都出现k次,那么这些出现k次的数,它对应的二进制位中,为1的bit位,也是出现k次的,那么就可以用一个大小为32的数组,记录数组中所有数在这32个bit位中,出现的1的次数,最终出现1次的数,它对应的为1的bit位中1出现的次数必定是对k取模余1的,那么这32个bit位中,谁对k取模,就将一个1向左移动对应数量的位,将所有这些移动后的数相加就是出现一次的数了。
public int foundOnceNumber (int[] arr, int k) { // write code here if (arr == null){ return 0; } int[] bitValue = new int[32]; for (int i : arr) { for (int j = 0; j < 32; j++) { int cur = 1 << j; if ((cur & i) != 0){ bitValue[j] ++; } } } int res = 0; for (int i = 0; i < bitValue.length; i++) { if (bitValue[i] % k != 0){ res += (1 << i); } } return res; }