剑指Offer56.II 数组中数字出现的次数II(位运算的性质)
思路:本题最容易想的思路就是哈希表,第二种思路是使用位运算,由于只有一个数只出现了一次,其余数字都出现了三次,那么也就是说除去这个出现一次的数字以外,剩余的数字之和可以被三整除,同时,这些数字在二进制某一位上为1的个数也应该是三的倍数,如果某一位上 1的个数不是3的倍数说明那个只出现一次的数在那一位是1,所以问题就简单起来了。我下面是逐个统计每一位为1的和,然后直接计算答案,等到所有数字都为0之后直接结束算法。
参考代码

1 public static int singleNumber(int[] nums) { 2 3 int num; // 标志每一位上1的个数 4 int temp = 0; // 标志目前是第几位,从零算起 5 int ans = 0; // 最终答案,迭代计算 6 int len = nums.length; 7 boolean flag = true; // 当所有数字都为零时退出循环 8 while(flag){ 9 num = 0; 10 flag = false; 11 for(int j = 0; j < len; j ++) { 12 if(nums[j] > 0) flag = true; 13 if(nums[j] % 2 == 1) { 14 num ++; 15 } 16 nums[j] >>= 1; 17 } 18 if(num % 3 != 0) { 19 ans += Math.pow(2, temp); 20 } 21 temp ++; 22 } 23 return ans; 24 }
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步