zoukankan      html  css  js  c++  java
  • 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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Docker跨平台架构的新特性buildx的启用方式
    Linux 如何安装rvm和ruby
    Linux
    ubuntu安装 vmware workstation pro 15.1.1
    docker-compose搭建golang本地开发环境
    linux 常用命令
    leetcode 1046 最后一块石头的重量
    leetcode 330 按要求补齐数组
    MySQL 字符集与比较规则
    Python 是什么语言
  • 原文地址:https://www.cnblogs.com/itdef/p/12817686.html
Copyright © 2011-2022 走看看