Leetcode 137. 只出现一次的数字 II 位运算

地址 https://leetcode-cn.com/problems/single-number-ii/

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3
示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

解法 考虑位运算

一个整数 二进制下有32位

如果数字出现3次 那么该位的1出现的次数肯定是3的倍数

单独出现一次的那个数 如果在某一位为1  那么最后该位1出现的次数就会是3的倍数加1

例如 示例1

2 2 2 3

转换成二进制就是

10 

10

10

11

___________________

41 ==> 11  等于十进制的3

示例2

    0

    1

    0

    1

    0

    1

‭  110 0011‬

-------------------------

1100014=> 1100011 就是十进制的99

我们统计完所有数字在32位中1的出现次数 将1出现次数为3的倍数置零 最后结果就是答案

代码如下

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        int r[32] = {0};
        for(int i = 0; i < 32;i++){
            int sum = 0;
           for(auto e:nums){
               if((e>>i) &1) sum++;
            }
            if(sum%3 != 0)   
            {  
                ret ^= (1<<i);
            }
        }

       return ret;
        
    }
};
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
阿里打赏 微信打赏
原文地址:https://www.cnblogs.com/itdef/p/12817686.html