Leetcode-每日一题【剑指 Offer 56 - II. 数组中数字出现的次数 II】

题目

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

示例 1:

输入:nums = [3,4,3,3]
输出:4


示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

限制:

  • 1 <= nums.length <= 10000
  • 1 <= nums[i] < 2^31

解题思路

1.对于这道题我们考虑数字的二进制形式,对于出现三次的数字,各 二进制位 出现的次数都是3 的倍数。因此,统计所有数字的各二进制位中 1 的出现次数,并对 3 求余,结果则为只出现一次的数字。

举个栗子:

Leetcode-每日一题【剑指 Offer 56 - II. 数组中数字出现的次数 II】_第1张图片

2.因此我们需要设置一个数组 arr[ ] 来记录我们数组中的所有数字各个二进制位上 1 出现的次数, 变量 m 用来寻找二进制位为 1 的位数,变量 sum 用来保存最终的结果,我们用两个 for 循环去遍历数组 nums ,第一次循环先去判断数组中所有数字的二进制位的最低位,只有最低位为 1 时与m = 1进行与运算后结果才不为0,我们将所有最低位为 1 的数的个数统计到arr[i]中。

3.然后用arr[i] 对 3 取余,并将结果乘以 m后存放在sum中,然后再将m向左移一位变为m = 10,去统计二进制的第二位为 1 的数字的个数,以此类推,直到所有位数统计完成,返回sum即可。

 

代码实现

class Solution {
    public int singleNumber(int[] nums) {
        int[] arr = new int[32];
        int m = 1;
        int sum = 0;
        for(int i = 0; i < 32; i++){
            for(int j = 0; j < nums.length; j++){
                if((nums[j] & m) != 0  ){
                    arr[i]++;
                }
            }
            arr[i] = arr[i] % 3;
            sum = sum + arr[i] * m;
            m = m << 1;
        }
        return sum;

    }
}

测试结果

Leetcode-每日一题【剑指 Offer 56 - II. 数组中数字出现的次数 II】_第2张图片

Leetcode-每日一题【剑指 Offer 56 - II. 数组中数字出现的次数 II】_第3张图片 

 

你可能感兴趣的:(leetcode,算法,职场和发展)