算法练习——位运算

news2025/2/14 6:08:24

前言:位运算的方法大多比较抽象,很难想到。

一:判断字符是否唯一

题目要求:

解题思路:

法一:使用hash的思想,统计每一个字母出现的次数,再通过一次循环遍历查询是否有超过1的字母,有就返回false,没有返回true

法二位运算(此处利用位图的思想)。字母一共只有26个,而一个int型整数有32个bit位,因此完全能够通过一个 int型整数的不同位 来充当hash表来统计每个字母出现的次数,想法和法一类似,只不过是通过位图的思想来实现

实现代码:

    bool isUnique(string astr) {
        int Bit_Count = 0;
        for(auto s : astr)
        {
            if(((Bit_Count >> (s-'a')) & 1) == 1)
            {
                return false;
            }
            else{
                Bit_Count |=(1<<s-'a');
            }
        }
        return true;
    }

二:丢失的数字

题目要求:

解题思路:

后续表达中:将丢失的数字 = 答案

思路:先将所有的数据异或,然后再将异或得到的结果与 0~n的所有数异或,最终得到答案。

之所以能够得到答案是因为,这两组数中,只有答案出现了一次,其他均出现了两次,而 a ^ a = 0,0 ^ b = b。

实现代码:

    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int tmp = 0;
        for(auto num : nums)
        {
            tmp ^= num;
        }
        while(n)
        {
            tmp^=n;
            n--;
        }
        return tmp;
    }

三:两整数之和

题目要求:

解题思路:

实现代码:

    int getSum(int a, int b) {
        while(b)
        {
            int c = a;
            a ^= b;
            b &= c;
            b<<=1;
        }
        return a^b;
    }

四:只出现一次的数字Ⅱ

题目要求:

解题思路:

后续表达中:将丢失的数字 = 答案

思路:数组的规律是:一个数出现3次,另一个数出现1次。那么就按bit位,通过for循环,记录32个bit位上,统计每位1出现的次数。

如果某位统计得到的1的个数为 0或3,说明该位不是答案的高位之一

如果某位统计得到的1的个数为 1或4,说明该位是答案的高位之一

:按照上述思路,可以写出任意一个出现n次的数和出现1次的数的代码。

实现代码:

    int singleNumber(vector<int>& nums) {
        int dest = 0;
        for(int i = 0; i<32; i++)
        {
            int total = 0;
            for(auto s : nums)
            {
                //统计每一位上1出现的次数
                if(((s>>i) & 1) == 1)
                {
                    total++;
                }
            }
            //若出现的次数%3 不为0 说明最终答案在该位上为高位
            if(total%3 == 1)
            {
                dest |= (1<<i);
            }
        }
        return dest;
    }

五:只出现一次的数字Ⅲ

题目要求:

解题思路:

思路:以示例1为例,将所有数异或得到 3^5。再去查找 3^5 中 第一个1的位置diff,并记录下来,diff位上,3和5是的位数是不同的。然后我们再一次去异或这组数据,不过需要以diff位上是否为高位作为条件去异或,这样异或就把 3 5 拆分开来了,并最终得到答案。

实现代码:

    vector<int> singleNumber(vector<int>& nums) {
        int tmp = 0;
        //第一次异或得到 两个数的异或值
        for(auto s : nums)
        {
            tmp ^= s;
        }
        int diff = 0;
        
        //循环找1,分了将两个数分开
        while(1)
        {
            if(((tmp>>diff) & 1) == 1)
            {
                break;
            }
            diff++;
        }
        //再次异或得到答案
        int a = 0;
        int b = 0;
        for(auto s : nums)
        {
            if(((s>>diff) & 1) == 1)
            {
                a^=s;
            }
            else
            {
                b^=s;
            }
        }
        return {a,b};
    }

六:消失的两个数字

题目要求:

解题思路:

后续表达中:将丢失的数字 = 答案1、答案2

此题结合了第二题与第五题的思路

思路:我们先按照第二题的思路,将所有数异或,因为数组包含1~N所有整数,所有我们再异或这1~N的所有整数,这样就得到了:答案1 ^ 答案2,此时这题就变成了第五题的样子,接下来的思路就和第五题完全一样了。

实现代码:

    vector<int> missingTwo(vector<int>& nums) {
        int tmp = 0;
        for(auto s : nums)
        {
            tmp ^= s;
        }
        for(int i = 1; i<=nums.size()+2; i++) //+2是因为数组中只有两个数,又因为丢失两个数
        {                                     //所以总和是4
            tmp ^= i;
        }
        
        int diff = 0;
        while(1)
        {
            if((tmp>>diff) & 1) break;
            diff++;
        }
        
        int a = 0;
        int b = 0;
        for(auto s : nums)
        {
            if(((s>>diff) & 1) == 1) 
            {
                a^=s;
            }
            else
            {
                b^=s;
            }
        }
        for(int i = 1; i<=nums.size()+2; i++)
        {
            if(((i>>diff) & 1) == 1) 
            {
                a^=i;
            }
            else
            {
                b^=i;
            }
        }
        return {a,b};
    }

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

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

相关文章

TCN-Transformer+LSTM多变量回归预测(Matlab)添加气泡图、散点密度图

TCN-TransformerLSTM多变量回归预测&#xff08;Matlab&#xff09;添加气泡图、散点密度图 目录 TCN-TransformerLSTM多变量回归预测&#xff08;Matlab&#xff09;添加气泡图、散点密度图预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基本介绍 1.双路创新&#xff…

【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。

概括 本篇笔记涵盖基础查询、视图、存储过程、函数、索引、优化、分库分表。适合在学完mysql后进行时常观看。下面展示部分内容。如果需要可以在文章底部的链接进行下载查看。 简介 数据库 数据库&#xff1a;DataBase&#xff0c;简称 DB&#xff0c;存储和管理数据的仓库…

DataSourceClosedException_ dataSource already closed

修改了项目中kafka相关配置&#xff0c;准备上线&#xff0c;控制台一直报错&#xff1a; 一直不停的在刷数据库连接池已关闭&#xff1f;&#xff1f;&#xff1f; 只改了kafka相关的配置&#xff0c;为什么数据库连接池一直在报错&#xff1f;即使kafka配置写错了&#xff…

SpringCloudAlibaba技术栈-Nacos

1、什么是Nacos&#xff1f; Nacos是个服务中心&#xff0c;就是你项目每个功能模块都会有个名字&#xff0c;比如支付模块,我们先给这个模块起个名字就叫paymentService,然后将这个名字和这个模块的配置放到Nacos中&#xff0c;其他模块也是这样的。好处是这样能更好地管理项…

Java中使用四叶天动态代理IP构建ip代理池,实现httpClient和Jsoup代理ip爬虫

在本次爬虫项目中&#xff0c;关于应用IP代理池方面&#xff0c;具体完成以下功能&#xff1a; 从指定API地址提取IP到ip池中&#xff08;一次提取的IP数量可以自定义更改&#xff09; 每次开始爬虫前&#xff08;多条爬虫线程并发执行&#xff09;&#xff0c;从ip池中获取一…

MySQL 数据库优化详解【Java数据库调优】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

工业大数据分析算法实战-day15

文章目录 day15特定数据类型的算法工业分析中的数据预处理工况划分数据缺失时间数据不连续强噪声大惯性系统趋势项消除 day15 今天是第15天&#xff0c;昨日是针对最优化算法、规则推理算法、系统辨识算法进行了阐述&#xff0c;今日主要是针对其他算法中的特定数据类型的算法…

定时任务——定时任务技术选型

摘要 本文深入探讨了定时任务调度系统的核心问题、技术选型&#xff0c;并对Quartz、Elastic-Job、XXL-Job、Spring Task/ScheduledExecutor、Apache Airflow和Kubernetes CronJob等开源定时任务框架进行了比较分析&#xff0c;包括它们的特点、适用场景和技术栈。文章还讨论了…

前端遇见AI:打造智能应用的新时代

随着技术的发展&#xff0c;AI&#xff08;人工智能&#xff09;不再局限于后端服务器上运行的复杂算法&#xff0c;而是逐渐渗透到前端领域&#xff0c;成为提升用户体验和应用智能水平的关键因素。本文将探讨前端与AI结合的趋势&#xff0c;以及如何利用前端技术实现AI功能&a…

KNN分类算法 HNUST【数据分析技术】(2025)

1.理论知识 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类&#xff0c;也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想&#xff1a; 对于任意n维输入向量&#xff0c;分别对应于特征…

使用 Three.js 创建一个 3D 人形机器人仿真系统

引言 在这篇文章中&#xff0c;我们将探讨如何使用 Three.js 创建一个简单但有趣的 3D 人形机器人仿真系统。这个机器人可以通过键盘控制进行行走和转向&#xff0c;并具有基本的动画效果。 技术栈 HTML5Three.jsJavaScript 实现步骤 1. 基础设置 首先&#xff0c;我们需要…

Android unitTest 单元测试用例编写(初始)

文章目录 了解测试相关库导入依赖库新建测试文件示例执行查看结果网页结果其他 本片讲解的重点是unitTest&#xff0c;而不是androidTest哦 了解测试相关库 androidx.compose.ui:ui-test-junit4: 用于Compose UI的JUnit 4测试库。 它提供了测试Compose UI组件的工具和API。 and…

【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块

目录 一、温度传感器模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;STS30-DIS-B &#x1f319;引脚分配 &#x1f319;通信 &#x1f319;时钟拉伸&#xff08;Clock Stretching&#xff09; &#x1f319;单次触发模式 &#x1f319;温度数据转…

如何在任何地方随时使用本地Jupyter Notebook无需公网IP

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 今天就来给大家安利一套神器组合&#xff1a;通过Windows系统本地部…

长沙景区数据分析项目实现

一、设计题目 长沙景区数据分析项目 二、设计目的 通过本项目让学生独立完成数据统计、数据可视化、数据分析的过程&#xff0c;并提高学生解决问题的能力。 三、设计要求 读取‘长沙景区信息.xlsx’文件&#xff08;读取Excel文件的方法为pandas.read_excel()&#xff0c…

Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)

数据的存储是基于 主题&#xff08;Topic&#xff09; 和 分区&#xff08;Partition&#xff09; 的 Kafka是一个高可靠性的分布式消息系统&#xff0c;广泛应用于大规模数据处理和实时, 为了更方便地管理和监控Kafka集群&#xff0c;开发人员和运维人员经常需要使用可视化工具…

PHP后执行php.exe -v命令报错并给出解决方案

文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网&#xff0c;找到DOWNLOADS 然后往下翻&#xff0c;找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载&#xff0c;选择No thanks,just start my download. 然后双击进行…

Excel粘贴复制不完整的原因以及解决方法

在数据处理和分析的过程中&#xff0c;Excel无疑是不可或缺的工具。然而&#xff0c;在使用Excel进行复制粘贴操作时&#xff0c;有时会遇到粘贴不完整的情况&#xff0c;这可能会让人感到困惑和烦恼。本文将深入探讨Excel粘贴复制不完整的原因、提供解决方案&#xff0c;并给出…

嵌入式轻量级开源操作系统:HeliOS的使用

嵌入式轻量级开源操作系统:HeliOS的使用 &#x1f4cd;项目地址&#xff1a;https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目&#xff0c;用于构建和维护HeliOS嵌入式操作系统&#xff08;OS&#xff09;。HeliOS是一个功能齐全的操作系统&#xff0…