【位运算】--- 进阶题目赏析

news2024/9/20 7:54:20

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:        9ilk

(๑•́ ₃ •̀๑) 文章专栏:     算法Journey 


本节我们来赏析位运算的一些进阶题目。


🏠 只出现一次的数字II

📌 题目解析

只出现一次的数字II

📌 算法原理

✏️ 思路一:哈希表+异或

由题目意思可得,除了只出现一次的数字之外,其他数字都出现了三次,我们可以利用哈希表,我们遍历一遍数组,将这些数异或用ret记录,当某个数出现三次时,我们再用ret异或这个数,最后得到的结果就是只出现一次的数字,因为其他数字在我们操作下都出现了四次被异或为0。

参考代码:

class Solution {
public:
    int singleNumber(vector<int>& nums)
    {
        unordered_map<int,int> hash;
        int ret = 0; 
        for(const auto& e : nums)
        {
            hash[e]++;
            ret ^= e;
            if(hash[e] == 3) //出现三次再次异或
              ret ^= e;
        }      
        return ret; 
    }
};


✏️ 思路二: bit位分组

由于其他数字都出现3次,因此我将数组中每个数特定bit位相加,对于出现过三次的这些数,他们特定bit位相加得到的一定是3的倍数,%3得到0,最后数组中所有数加完后再%3得到的一定是只出现一次那个数字上的bit位的数字.因此,我们可以不断向左移,对每个bit位进行这样的操作,就能得到只出现一次数字的完整bit位了.

参考代码:

class Solution {
public:
    int singleNumber(vector<int>& nums)
    { 
        int ret  = 0;
        for(int i = 0 ; i < 32 ; i++)
        {
            int sum = 0;
            for(int x : nums)
            {
                 if((x>>i)&1) sum++;
            }
            sum %= 3;//得到的是只出现一次数字i位上的数字
            if(sum == 1) ret |= (1 <<i);
        }
        return ret; 
    }
};



拓展 : 如果其他数出现n次,另外一个数字出现m次,我们同样可以利用这种方式来找出不同点(%n)从而来找到只出现一次的数字.

🏠 只出现一次的数字III

📌 题目解析

只出现一次的数字III

  • -2^31 <= nums[i] <= 2^31 - 1 注意数据范围过大使用int可能会导致数据溢出。

📌 算法原理

由图中我们可以知道,ret最后一定是两个只出现一次的数字(记为a和b)的异或,由于异或是相同为0,相异为1,因此我们可以利用n&(-n)提取异或后的ret最右边的1,也就是a和b在这个bit位上的数字不同,依照这个不同可以将原数组中的数字划分为两种:一种是k位上是1,一种是k位上是0,由于其他数字出现了两次他们异或之后得到的一定是0,最后ret1和ret0得到的一定是只出现一次的两个数字。

参考代码:

class Solution 
{
public:
   typedef long long ll;
    vector<int> singleNumber(vector<int>& nums)
    {
          ll ret = 0;
       for(int i = 0 ; i < nums.size() ; i++)
       {
           ret ^= nums[i]; //得到的是两个不同的数异或
       }
       //我们先找ret最右边的1因为异或相异为1 这样就可以依照这个把a分到这一位上有0/1,b分到这一位有1/0
       ll k = ret & (-ret);
       //用k判断某一位是1还是0
       ll ret1 = 0;
       ll ret0 = 0;
       for(int i = 0 ; i < nums.size();i++)
       {
          if(nums[i] & k) //说明该位上为1
              ret1 ^= nums[i];
          else
            ret0 ^= nums[i];
       }
 
        return {(int)ret1,(int)ret0};
    }
}s2;

🏠 消失的两个数字

📌 题目解析

消失的两个数字

📌 算法原理

这道题其实就是丢失的数字 + 只出现一次的数字III。我们可以通过nums的数组长度知道未消失前数字的总数。异或一遍原来数字再异或一遍nums,就可以得到消失两个数字的异或。此时就转化为只出现一次的数字III,可以利用ret&(-ret)提取两者不同的bit位,依据不同再遍历一遍进行分组得到这两个数字。

参考代码:

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) 
    {
        int n = nums.size() + 2;
        int ret = 0;
        for(int i = 1 ; i <= n ; i++)
        {
             ret ^= i;
        } 
        for(auto& e : nums)
        {
            ret ^= e;
        }// 1^4
        int k = ret & (-ret); //提取最右边的一个1 消失的两个数在第k位不同
        int ret1 = 0;
        int ret0 = 0;
        for(int i = 1 ; i <= n ; i ++)
        {
              if(i & k)
               ret1 ^= i;
              else
               ret0 ^= i; 
        }
        for(auto& e : nums)
        {
             if(e & k)
               ret1 ^= e;
              else
              ret0  ^= e; 
        }
        int max = 0;
        int min = ret0 > ret1 ? (max = ret0,ret1) : (max = ret1,ret0);
        return {min,max};
    }
};

完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anylogic制作界面元素tips

点击元素后跳转至其他视图&#xff0c;且能够把某个共同元素移植过去 navigate( viewStatistics2 ); groupControls.setX( groupControls.getX() 1200 );

python-笨小猴

题目描述 笨小猴的词汇量很小&#xff0c;所以每次做英语选择题的时候都很头疼。但是他找到了一种方法&#xff0c;经试验证明&#xff0c;用这种方法去选择选项的时候选对的几率非常大&#xff01; 这种方法的具体描述如下&#xff1a;假设maxn是单词中出现次数最多的字母的出…

kafka3.7.1 单节点 KRaft部署测试发送和接收消息

一、环境准备 kafka3.7.1 包下载地址&#xff1a; https://mirrors.nju.edu.cn/apache/kafka/3.7.1/kafka_2.13-3.7.1.tgz openjdk11.0.2 下载地址&#xff1a; https://mirrors.nju.edu.cn/openjdk/11.0.2/openjdk-11.0.2_linux-x64_bin.tar.gz 二、openjdk 安装 【如已安装…

设计模式学习-简单的命令模式例子

上一章节介绍过了命令模式&#xff0c;这一篇文章就简单的做一个小案例来巩固学习 搭建场景 简单的搭建一个场景就行 &#xff0c;随便准备一个物体放在场景中位置Reset一下即可。 代码编写 定义接口&#xff08;或者抽象类&#xff09;ICommand 用来规范Command的行为。注意…

在线音乐播放器项目

在线音乐播放器项目 登录页面 注册页面 主页 上传文件 我的喜欢 前端 js html css 三剑客 后端 Spring Boot框架 插件有:Spring Boot DevTools、Lombok、Spring Web、MySQL Driver、MyBatis Framework、security、detect 数据库有 三张表 lovemusic、music、user 工具类( co…

pycharm的Structure是什么,怎么打开,每个图标的功能是什么

一、Structure的含义 在PyCharm中&#xff0c;Structure是一个非常有用的功能&#xff0c;它可以帮助开发者快速浏览和理解当前文件的代码结构&#xff0c;Structure视图通过不同的图标来表示代码中的不同元素。 二、如何打开Structure功能 在windows上可以通过Alt7来打开St…

VsCode + Go + macOS 小白 demo运行

1. 安装&#xff1a;brew install go 2. 设置工作目录和代理 ​ go env -w GOPATH/Users/niu/code/goexport GOPROXYhttps://goproxy.cngo env -w GO111MODULEongo env 查看上面三个值是否和设置的一样​ 3. 安装vscode. go插件 4. vscode打开GOPATH设置的工作目录 command…

ESP32无线WiFi芯片模组,设备物联网连接通信,产品智能化交互升级

在数字化浪潮的推动下&#xff0c;我们正步入一个万物互联的新时代。物联网&#xff08;IoT&#xff09;技术&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐渗透到我们生活的每一个角落。 乐鑫正通过其创新的无线WiFi芯片模组&#xff0c;为这些领域的发展提…

Linux动态监控系统

目录 动态监控进程 介绍 基本语法 选项说明 交互操作说明 应用实例 动态监控进程 介绍 top指令类似于ps命令&#xff0c;只是top在执行一段时间可以更新正在运行的进程。 基本语法 选项说明 负载那三个值加起来除以三若大于零点7就说明负载较大 &#xff0c;buff是占用…

全网最全的安服工程师修炼手册

全网最全安服工程师修炼手册 本篇文章主要介绍安全服务工程师的必备技能&#xff0c;也是简单记录下我的安服历程&#xff01; 思维导图附上 点击下载 基础技能 网络 IP IP概念&#xff1a;IP地址被用来给Internet上的电脑一个编号。日常见到的情况是每台联网的PC上都需要…

Faiss向量数据库

Faiss&#xff08;Facebook AI Similarity Search&#xff09;向量数据库是由Facebook AI研究院开发的一种高效相似性搜索和聚类的库。Faiss不仅支持在高维空间中进行高效的相似性搜索&#xff0c;还能够在处理大规模数据集时展现出卓越的性能&#xff0c;尤其适用于图像检索、…

C# SM2 SM3 SM4 使用

目录 效果 SM2 SM3 SM4 项目 代码 SM2Utils.cs Sm3Utils.cs Sm4Utils.cs 下载 效果 SM2 公钥&#xff1a;04ca3e272e11b5633681cb0fbbfd8c162be08918ce5b644cd33d49c17be8674caf6c20a11de8b65333924dfe7d42246abb4a4c36b663bef1aafc624a35acf4d2b1 私钥&#xff1a;…

多个视频怎么合成一个视频?这10款视频合并软件大家都在用,适合手机和电脑!

如果您希望利用拍摄的片段制作出色的电影或视频故事&#xff0c;选择合适的视频合并软件是非常关键的。此外&#xff0c;视频剪辑的复杂程度可能会让人感到意外&#xff0c;有时简单得让人吃惊。专业的视频剪辑合并大师能够大大简化视频合并的过程&#xff0c;这正是它们的价值…

『功能项目』主角的信息显示【16】

本章项目成果展示 我们打开上一篇15怪物的信息显示的项目&#xff0c; 本章要做的事情是对主角的UI信息实时显示 创建一个脚本&#xff1a;UIManager.cs 创建一个空物体作为钉子钉在左上角命名为LeftUp 创建Image做为头像 将以下资源导入Art文件夹 将以下资源图片放至Art文件夹…

思维导图软件全攻略:5款软件横向对比

思维导图作为一种图形化的工具&#xff0c;能够帮助我们更有效地组织和表达放射性思维。在学习和工作中&#xff0c;思维导图的作用不可小觑&#xff0c;它不仅帮助我们理清思路&#xff0c;还能提升我们的工作效率。通过可视化的方式&#xff0c;思维导图将复杂的信息分解成更…

JDK原理

当我们谈论JDK&#xff08;Java Development Kit&#xff09;的原理时&#xff0c;实际上是在探讨Java语言及其开发环境背后的技术和设计思想。JDK是Java编程语言的核心工具包&#xff0c;它包含了Java运行环境&#xff08;JRE&#xff09;、Java编译器&#xff08;javac&#…

U盘数据恢复哪家强?四款神器拯救你的文件!

随着科技的发展&#xff0c;我们越来越依赖于电子设备来储存和传输数据。然而&#xff0c;数据丢失的情况也时有发生&#xff0c;尤其是当我们的数据存储在U盘等移动设备上时。这时&#xff0c;U盘数据恢复软件就显得尤为重要了。本文将为大家介绍四款常用的U盘数据恢复软件&am…

按箭头上下左右来实现简单二层级树形结构

按箭头上下左右来实现简单二层级树形结构 .vue template内容 <div class"nav-container"><ul class"nav-list" :class"{ border-glow: status F }"><liv-for"(item, index) in items":key"index"click&…

iOS 18降级后遭遇“白苹果”?可试试这几种解决办法

随着苹果iOS系统的不断升级&#xff0c;用户们总是满怀期待地尝试最新的系统版本&#xff0c;但偶尔也会因为某些原因选择降级回旧版本。然而&#xff0c;iOS 18降级后遇到“白苹果”问题&#xff0c;无疑给许多用户带来了困扰。今天&#xff0c;我们就来探讨一下&#xff0c;当…

CAD二次开发IFoxCAD框架系列(26)- 分段测量多段线长度和计算多边形的面积

#region 分段测量多段线长度private static double textHight 10;[CommandMethod(nameof(PolylineDemo))]public void PolylineDemo(){using var tr new DBTrans();if(!tr.LayerTable.Has("标注")){tr.LayerTable.Add("标注",1);}var pso new PromptSel…