题目链接:剑指 Offer 56 - II. 数组中数字出现的次数 II
官方题解:面试题56 - II. 数组中数字出现的次数 II(位运算 + 有限状态自动机,清晰图解)
思路:数组中只有一个数字出现一次,其他数字出现三次,那么可以统计二进制各个位数上各自1出现的次数,然后模3,那么最后得到的二进制位数就是指出现过一次的数。
代码:
class Solution { public int singleNumber(int[] nums) { int[] counts = new int[32]; for(int n : nums){ for(int i=0; i<32; i++){ int p = 1 << i; if((n & p) == p){ counts[31-i] ++; } } } int res = 0; for(int i = 0; i<32; i++){ res <<= 1; res |= counts[i] % 3; } return res; } }
ps:用map的方法比这更快点