剑指 Offer 56 - II. 数组中数字出现的次数 II

描述

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

链接

剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(LeetCode) (leetcode-cn.com)

 

解法:位运算yyds

 

解题思路

如下图所示,考虑数字的二进制形式,对于出现三次的数字,各 二进制位 出现的次数都是 3 的倍数。

因此,统计所有数字的各二进制位中 1 的出现次数,并对 3 求余,结果则为只出现一次的数字。

 

 1 class Solution {
 2     public int singleNumber(int[] nums) {
 3         // 
 4         if (nums == null) return -1;
 5         int res = 0;
 6 
 7         // for循环中 用 i 去 控制 是在 哪一位
 8         for (int i = 0; i < 32; i++) {
 9             int oneCount = 0;
10             for (int num : nums){
11                 oneCount += (num >>> i) & 1;
12             }
13             if (oneCount % 3 == 1)  // 只有当 为 1的时候,因为除了 自己,其他的都有 3 * n
14                 res |= 1 << i;  //  运算符 | 或 运算,为保证 100 | 10 = 110
15         }
16         return res;
17     }
18 }

 

 

posted @ 2021-11-30 20:32  DidUStudy  阅读(20)  评论(0编辑  收藏  举报