初识算法 · 位运算(2)

news2025/4/6 22:55:49

目录

前言:

判定字符是否唯一

丢失的数字

比特位计数

只出现一次的数字III


前言:

​本文的主题是位运算,通过四道题目讲解,一道是判断字符是否唯一,一道是只出现一次的数字III,一道是比特位计数,一道是丢失的数字。
链接分别为:

338. 比特位计数 - 力扣(LeetCode) 面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

260. 只出现一次的数字 III - 力扣(LeetCode) 268. 丢失的数字 - 力扣(LeetCode)

因为这些题目都是比较简单的,所以一一揉在一起介绍。

那么,话不多说,直接进行主题咯。


判定字符是否唯一

这道题目是作为面试题目出现的,作为一道面试题目,它有很多解法,比如我们可以使用哈希映射,使用map 使用set,使用函数count就可以判断是否出现了两次,也可以使用数组,遍历一遍,看哪个下标对应的值是2就返回false即可,解法是非常非常多的,说白了,这道题目就是让我们判读这堆“数字”里面是否有重复的数字。

那么前两个方法,多多少少都用到了额外的数据结构,额外的空间,相对来说还是没有那么好,毕竟空间还是大了一点,我们不妨利用位图的思想,一个Int就可以搞定,遍历到的时候,将位图对应的位置置为1,再次如果判断到了,直接返回false即可。

当然了,这道题目可以使用鸽巢原理进行优化,一共才26个英文字符,如果字符串的长度超过了26,直接返回false即可。

以上是题目解析 + 算法原理,以下是原理编写:

class Solution 
{
public:
    bool isUnique(string astr) 
    {
        int bitmap = 0;
        for(auto e : astr)
        {
            int x = e - 'a';
            if(((bitmap >> x) & 1) == 1) return false;
            else bitmap |= (1 << x);
        }    
        return true;
    }
};

丢失的数字

题目十分简单,我们现在应该思考的是,我们可以用多少种解法,这道题目无非就是让我们从一个连续的数集里面找到缺失的数字就可以了。“那这道题不就是缺失的数字吗”

第一种解法,高斯求和,因为数字肯定是从0开始到n的,所以我们可以将0到n这段区间的所有的数字加起来,最后减去给我们的这段区间的和即可。时间复杂度为O(N) 空间复杂度为O(1)

第二种解法,哈希映射,我们就开一个n + 1的数组,遍历数组,对应下标+1,看谁为2即可。时间复杂度为O(N) 空间复杂度为O(N),相对来说就不是那么好了。

第三种解法,遍历数组看i + 1是否为前一个数 + 1即可。

第四种解法,异或的运算律,数组的下标和数异或,看谁空出来了就可以了。

class Solution {
public:
    int missingNumber(vector<int>& nums) 
    {        
        sort(nums.begin(),nums.end());
        if(nums[0] != 0) return 0;
        int i = 0;
        for(i = 0; i < nums.size() - 1; i++)
        {
            if(nums[i] != (nums[i + 1] - 1)) return nums[i] + 1;
        }    
        return nums[i] + 1;
    }
};

对于第三种解法是比较差劲的,因为还是注意许多细节问题,比如需要先排序,还要判断1 2的这种情况,那么对于异或来说,就很不错了:

class Solution 
{
public:
    int missingNumber(vector<int>& nums) 
    {
        int ret = 0;
        for(auto e : nums) ret ^= e;
        for(int i = 1;i <= nums.size();i++)
            ret ^= i;

        return ret;
    }
};

比特位计数

题目的要求是计算从0到n的所有的数中的二进制表示中1的个数,将个数插入到顺序表,然后返回就可以了。

那这道题不就是多次计算比特位中1的个数吗?我们甚至可以直接复用上篇那道题目的代码:

class Solution 
{
public:
    int countone(int n)
    {
        int x = 0;
        while(n)
        {
            n &= (n - 1);
            x++;
        }
        return x;
    }
    vector<int> countBits(int n) 
    {
        vector<int> v;
        for(int i = 0; i <= n; i++)
        {
            v.push_back(countone(i));
        }
        return v;
    }
};

只出现一次的数字III

这道题目无非就是找单身狗plus版本而已,就是缺失的数字嘛对吧!

我们需要找到两个数,那么异或整个数组肯定是少不了的,异或了之后,剩余的是两个数的异或结果,那么我们如何分离出来呢?

我们可以结合基本题目 :提取最低位的1,提取出来之后,两个只出现一次的数字在该位上一定是不同的,因为异或出来结果是1,其他的数也异或掉了,所以一定是一个为1,一个为0。

那么我们利用这个特点,将数组中的每个数组和最低位的数字一&运算一下,就可以得到结果了,因为没有要求顺序,所以我们可以直接输出。

class Solution 
{
public:
    vector<int> singleNumber(vector<int>& nums) 
    {
        //先将整个数组异或
        int ret = 0;
        for(auto e : nums) ret ^= e;
        //获取最低位的1->实际上是分组
        // int low_bit = ret & -ret;
         int low_bit = (ret == INT_MIN ? ret : ret & (-ret));
        //开始分组
        int ans1 = 0, ans2 = 0;
        for(auto e : nums)
        {
            if(e & low_bit) ans1 ^= e;
            else ans2 ^= e;
        }
        return { ans1, ans2 };
    }
};

以上就是位运算的多个题目解析。


感谢阅读!

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

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

相关文章

丹摩征文活动 | 丹摩智算平台:服务器虚拟化的璀璨明珠与实战秘籍

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、丹摩智算平台概述 &#xff08;一&#xff09;平台架构 &#xff08;二&#xff09;平台特点 三、服务器虚拟化基础 &#xff08;一&#xff09;虚拟化的概念 &#xf…

[Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享

目录 Docker 镜像是什么 生活案例 为什么需要镜像 镜像命令详解 实验 1.一些操作 1. 遍历查看镜像 2. 查看镜像仓库在本地的存储信息 进入镜像存储目录 查看 repositories.json 文件 3. 镜像过滤 4. 下载镜像时的分层 实战一&#xff1a;离线迁移镜像 实战二&…

信用租赁系统的灵活配置与智能化管理助力租赁市场发展

内容概要 在现代租赁市场中&#xff0c;信用租赁系统就像一把金钥匙&#xff0c;打开了灵活配置与智能化管理的大门。首先&#xff0c;让我们看看它是如何运作的。这个系统允许用户根据自身需求自定义设备类型和信用分比例&#xff0c;不同租赁形式的选择使得整个过程更加个性…

Java基于SpringBoot+Vue框架的宠物寄养系统(V2.0),附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI&#xff08;图形设备接口&#xff09;中的一个函数&#xff0c;用于在设备上下文&#xff08;device context, DC&#xff09;之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…

OpenGL ES 文字渲染进阶--渲染中文字体

旧文 OpenGL ES 文字渲染方式有几种? 一文中分别介绍了 OpenGL 利用 Canvas 和 FreeType 绘制文字的方法。 无论采用哪种方式进行渲染,本质上原理都是纹理贴图:将带有文字的图像上传到纹理,然后进行贴图。 渲染中文字体 利用 Canvas 绘制中文字体和绘制其他字体在操作方式上…

T265相机双目鱼眼+imu联合标定(全记录)

最近工作用到t265&#xff0c;记录一遍标定过程 1.安装驱动 首先安装realsense驱动&#xff0c;因为笔者之前使用过d435i&#xff0c;装的librealsense版本为2.55.1&#xff0c;直接使用t265会出现找不到设备的问题&#xff0c;经查阅发现是因为realsense在2.53.1后就不再支持…

python数据分析|二 IPython和JupyterNotebooks

一 python 解释器 Python解释器同一时间只能运行一个程序的一条语句。 如何适用&#xff1a; win r cmd 要退出Python解释器返回终端&#xff0c;可以输入 exit() 或 Ctrl-D。 假设创建了一个 hello_world.py 文件&#xff0c;它的内容是&#xff1a; 可以用下面的命令运…

集群聊天服务器(2)Json介绍

目录 Json序列化Json反序列化 大家之间交流用json&#xff0c;想要发送数据&#xff0c;就把数据序列化成json,想要接收数据&#xff0c;就反序列化成自己程序的语言。 Json序列化 可以直接赋值一个容器对象 js[‘xx’]vec; #include "json.hpp" using jsonnlohman…

ES信息防泄漏:策略与实践

Elasticsearch(简称ES)作为一个开源的搜索和分析引擎&#xff0c;在实时搜索和分析大量数据方面发挥着重要作用。然而&#xff0c;随着数据的增长&#xff0c;ES的信息安全和隐私保护成为了关键问题。信息防泄漏对于ES来说至关重要&#xff0c;它不仅关乎数据的完整性&#xff…

NVR批量管理软件/平台EasyNVR多个NVR同时管理使用时需要开放的端口

随着科技的飞速发展&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为维护安全、提升效率的重要工具。为了更有效地管理和利用这些宝贵的视频资源&#xff0c;视频联网与整合技术应运而生&#xff0c;旨在打破地域与设备限制&#xff0c;实现视频资源的实时共享与…

设计模式(四)装饰器模式与命令模式

一、装饰器模式 1、意图 动态增加功能&#xff0c;相比于继承更加灵活 2、类图 Component(VisualComponent)&#xff1a;定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。ConcreteComponent(TextView)&#xff1a;定义一个对象&#xff0c;可以给这个对象添加一…

PL/SQL执行.sql文件

1.编写.sql文件&#xff0c;创建update.sql文件&#xff0c;文件如下&#xff1a; set feedback offset define off--更新表中所有人的年龄update a set age18;prompt Done. 2.打开plsql选择命令窗口&#xff0c;即选择File->New->Command Window&#xff1b; 打开后的…

改扩配系列:浪潮英政服务器CS5280H2、IR5280H2——板载前置3.5寸*12口背板

机器配置情况 机器是云产品原厂配置的超融合一体机3.5*12背板出厂接法&#xff0c;前置是硬盘背板作为超融合数据盘是直通的&#xff0c;使用板载接口没有过raid卡。 主板上的接口既是pcie转接卡的接口&#xff0c;又是sata控制器的接口&#xff0c;如果是nvme_ssd我能理解&am…

【3D Slicer】的小白入门使用指南四

开源解剖影像浏览工具Open Anatomy Browser使用及介绍 和3D slicer米有太大关系,该工具是网页版影像数据的浏览工具(可以简单理解为网页版的3D slicer) 介绍 ● 开放解剖(OA)浏览器是由神经影像分析中心开发的,基于网络浏览器技术构建的图谱查看器。 ● OA浏览器将解剖模…

基于正则化算法的SAR图像去噪matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1SAR 图像噪声模型 4.2 正则化算法基本原理 5.完整工程文件 1.课题概述 基于正则化算法的SAR图像去噪matlab仿真&#xff0c;仿真输出SAR图像去噪结果&#xff0c;正则化参数收敛曲线&#xff0c;同时…

【2024软考架构案例题】你知道 Es 的几种分词器吗?Standard、Simple、WhiteSpace、Keyword 四种分词器你知道吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

qt QUndoCommand 与 QUndoStack详解

1、概述 QUndoCommand 和 QUndoStack 是 Qt 框架中用于实现撤销/重做&#xff08;undo/redo&#xff09;功能的两个核心类。QUndoCommand 是表示单个可撤销操作的基类&#xff0c;而 QUndoStack 则负责管理这些命令的堆栈&#xff0c;提供撤销和重做操作的接口。 QUndoCommand…

数据分析:16s差异分析DESeq2 | Corncob | MaAsLin2 | ALDEx2

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍DESeq2原理计算步骤结果Corncob原理计算步骤结果MaAsLin2原理计算步骤结果ALDEx2原理计算步骤结果加载R包数据链接数据预处理微生物数据样本信息提取物种名称过滤零值保留结果读取…

【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)

在前端开发中&#xff0c;模块化是一个重要的概念&#xff0c;不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module&#xff0c;因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…