【每日易题】七夕限定——单身狗问题以及进阶问题位运算法的深入探讨

勤时当勉励 岁月不待人
C/C++ 游戏开发
Hello,米娜桑们,这里是君兮_,在写这篇博客的前一天是七夕,也是中国传统的“情人节”,不知道各位脱单了吗?碰巧最近刷题时遇到了经典的单身狗问题想带大家深入探讨一下,如果没脱单的话不如继续学习吧,记住,如果你喜欢的人不喜欢你,就变得足够优秀让她/他喜欢上你吧!!
单身狗问题的位运算解法
- 一.什么是单身狗问题?
- 找出一个单身狗
- 找两条单身狗
- 二.LeetCode单身狗进阶题
- 总结
一.什么是单身狗问题?
- 单身狗往往是这样的,在别人都成双成对的时候,只有你一个人孤独寂寞冷(比如博主)。而单身狗问题往往是找出一系列数中落单的那个
- 对于这种问题往往可以暴力求解,但这样显得不够“优雅”,毕竟我们是“单身贵族”嘛!所以我们这里就介绍一种时间复杂度和空间复杂度都比较低的方法——位运算法
找出一个单身狗
- 先举出最简单的例子
- 问题如下
//找出单身狗-版本1
//有一个数组只有一个数组出现一次,其余数字都是成对出现的
//请找出只出现一次的数字
//1 2 3 4 5 1 2 3 4
- 5就是这里的单身狗`
- 那我们怎样用位运算法求解呢?
我们知道对于异或来说相同为0,相异为1- 而异或又有这样的特性
//a^a=0;
//a^0=a;
- 同时,异或也满足交换律和结合律,我们就能写出以下代码
int find_single_dog1(int arr[], int sz)
{int i = 0;int ret = 0;for (i = 0; i < sz; i++){ret ^= arr[i];}return ret;
}int main()
{int arr[] = { 1,2,3,4,5,1,2,3,4 };int sz = sizeof(arr) / sizeof(arr[0]);int dog = find_single_dog1(arr, sz);printf("%d\n", dog);return 0;
}
- 什么意思呢?
- 我们通过一个函数把所有的元素都给异或在一起,我们知道相同元素异或在一起为0,而一个元素异或0等于它本身,这样,就可以得到这个“单身狗”了。

找两条单身狗
- 从上面这题我们又可以深入一点,如果此时有两个人,但是他们是同性或者是异性但是不适合呢?也就是说有两条单身狗我们又该如何解决呢?
//找出单身狗版本2
//一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。、
//编写一个函数找出这两个只出现一次的数字。
//例如:
//有数组的元素是:1,2,3,4,5,1,2,3,4,6
//只有5和6只出现1次,要找出5和6.
- 此时的难点在于,我们也可以通过把所有的元素都异或起来的方法找到这两条单身狗异或的值,但是我们怎样通过他俩异或的值找到相应的两个元素呢?
- 我们可以这样考虑,我们如果能把两条单身狗分到不同的组里,再找出每一个组中的单身狗不就和第一种情况一样了吗?
- 此时我们分组的条件就应该是两者一定存在差异的地方,哪里能凸显两者的差异呢?
- 先把代码放这,让大家自己想一下,下面会有详细的解释的
void find_single_dog2(int arr[], int sz, int* pd1, int* pd2)
{//1. 所有数字异或在一起int ret = 0;//5 ^ 6int i = 0;for (i = 0; i < sz; i++){ret ^= arr[i];}//2. 计算ret的第几位是1,从而找出不同进行分组int pos = 0;for (i = 0; i < 32; i++){if (((ret >> i) & 1) == 1){pos = i;break;}}//分组//计算数组中元素的第pos为1的异或 for (i = 0; i < sz; i++){if (((arr[i] >> pos) & 1) == 1){*pd1 ^= arr[i];}}//计算数组中元素的第pos为0的异或*pd2 = ret ^ *pd1;
}int main()
{int arr[] = { 1,2,3,4,5,1,2,3,4,6 };int dog1 = 0;int dog2 = 0;int sz = sizeof(arr) / sizeof(arr[0]);find_single_dog2(arr, sz, &dog1, &dog2);printf("%d %d", dog1, dog2);return 0;
}
- 看懂了吗?我来解释一下
- 我们这个ret是把所有数异或进来的,此时只剩下了两条单身狗异或的值,异或相异为1
也就是说找到ret二进制位是1的位置是不是就找到两条单身狗的不同之处啦?接下来通过分组就可找出单身狗 - 注意:相同的元素相应的二进制位一定相同,也就是非单身狗们一定会被分到同一组中,从而保证这组中异或后有且仅有一条单身狗。
- 这里还有一个能偷懒的地方,我们知道了两条单身狗异或的值,又找出了一条单身狗,通过异或法是不是就能快速找出另一条单身狗了?
a^b^a=b

二.LeetCode单身狗进阶题
- 题目的链接放在这里
错误集合

- 说到底,这个题就是单身狗题目的变种,我们同样是通过异或先找出重复出现的值和丢失的值,然后再对它们进行分组,依次找出即可
int* findErrorNums(int* nums, int numsSize, int* returnSize){int ret=0;int*returnNums=(int*)malloc(sizeof(int)*2);*returnSize=2;int i=0;//通过把数组中元素和1到n中元素异或起来,找到多余元素以及缺少的元素 (找两条单身狗)for(i=0;i<numsSize;i++){ret^=(i+1);ret^=nums[i];}int pos=0;i=0;//异或后不同位二进制为1,找1分组while(i<32){if(((ret>>i)&1)==1){pos=i;break;}i++;}//找出不同位后分组,只用找一个就行int nums1=0;int nums2=0;for(i=1;i<=numsSize;i++){if(((i>>pos)&1)==1){nums2^=i;}}for(i=0;i<numsSize;i++){if(((nums[i]>>pos)&1)==1){nums1^=nums[i];}}nums1^=nums2;//分组后的元素异或1-n找相同元素消掉//多的或者少的那个元素,不确定,我们需要判断一下int flag=0;//标记for(i=0;i<numsSize;i++){if(nums[i]==nums1){flag=1;returnNums[0]=nums1;break;}}if(flag==1)//数组中找到了这个元素,为重复元素,另一个为缺少元素returnNums[1]=ret^nums1;else{returnNums[1]=nums1;returnNums[0]=nums1^ret;}return returnNums;}
- 除了注释中提到的,我这里还想提两点需要注意的地方
- 与找单身狗不同,这里我们没有成对的元素,因此我们在分组前后都通过异或1到n的数找相同元素从而消掉,剩下的就是我们的单身狗了(有些人可能不理解重复的元素咋消掉啊,重复的元素在ret里就因为相同而消掉了,因此照样能找到这条单身狗哦)
- 与普通题不同的地方在于,我们这里找出两条单身狗后还有辨别一下哪个是重复元素,哪个是缺少元素,在区分时我们通过flag做了一个标记,flag的值被修改也就是数组存在这个数,说明它就是重复元素啦,另一个自然是缺少元素,反之未被修改就与这种情况相反。
总结
-
今天的内容到这里就结束了,有关位运算的地方如果不太清楚最后自己画画逻辑图就能弄懂,而有关题目博主建议如果看懂了的话不妨自己动手试试哦!!
-
好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

相关文章:
【每日易题】七夕限定——单身狗问题以及进阶问题位运算法的深入探讨
君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,在写这篇博客的前一天是七夕,也是中国传统的“情人节”,不知道各位脱单了吗?碰巧最近刷题时遇到了经典的单身狗问题想带大家深入探…...
消息队列前世今生 字节跳动 Kafka #创作活动
消息队列前世今生 1.1 案例一: 系统崩溃 首先大家跟着我想象一下下面的这个的场景, 看到新出的游戏机,太贵了买不起,这个时候你突然想到,今天抖音直播搞活动,打开抖音搜索,找到直播间以后&am…...
『SEQ日志』在 .NET中快速集成轻量级的分布式日志平台
📣读完这篇文章里你能收获到 如何在Docker中部署 SEQ:介绍了如何创建和运行 SEQ 容器,给出了详细的执行操作如何使用 NLog 接入 .NET Core 应用程序的日志:详细介绍了 NLog 和 NLog.Seq 来配置和记录日志的步骤日志记录示例&…...
Django会话技术
文章目录 Cookie实践运行结果 CSRF防止CSRF Session实践 Cookie 理论上,一个用户的所有请求燥作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆,而web应用程序是使用HTTP协议传输数据的。HTT…...
Tree of Thoughts: Deliberate Problem Solving with Large Language Models
本文是LLM系列的文章,针对《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》的翻译。 思维树:用大模型进行深思熟虑的问题解决 摘要1 引言2 背景3 思维树:用LM进行深思熟虑的问题解决4 实验5 相关工作6 讨论 摘…...
C语言刷题(13)
第一题 第二题 第三题 第四题 第五题 第六题 第七题 注意 1.nsqrt(n),sqrt本身不会将n开根 2.初始化已经令sumn了,故相加的个数为m-1次...
RK3568 uart串口
一.简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传 输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信 距离远,但是速度相对会低&a…...
企业数字化转型中,VR数字展厅能有哪些体验?
在数字化转型的浪潮下,企业纷纷开始注重数字展厅的开展,VR虚拟展厅结合VR全景技术,可以创造出许多有趣的玩法和体验,无论是虚拟参观、互动体验还是VR云会议对接,都为企业客户带来了全新的感知方式。 同传统展厅相比&am…...
关于cesium中tif文件处理加载在三维地图中得方式
项目场景: 在Gis项目关于tif影像数据是不能直接在地图上面加载,只能通过后端进行处理,或者前端进行处理之后才能叠加到地图上面! 处理方式 1.安装geotiff插件 npm install geotiff -g2.利用插件处理tif文件 import GeoTIFF, { fromBlob, fromUrl, fromArrayBuff…...
JAVA结合AE(Adobe After Effects)AE模板文件解析生成视频实现类似于逗拍(视频DIY)的核心功能
最近看抖音上有很多各种视频表白生成的直播而且直播间人很多,于是就思考如何实现的视频内的文字图片内容替换的呢 ,答案需要用到类似与逗拍一样的视频DIY的功能,苦于我是java,百度了半天没有办法和思路,总不能为了一个…...
美容行业如何快速搭建自己的预约小程序?
现在,搭建一个专属于美容行业的预约小程序不再是只有程序员才能做到的事情了。有了一些小程序制作平台的存在,任何人都可以轻松地制作出自己的小程序。下面,我将揭秘一个快速搭建专属美容行业预约小程序的秘诀。 首先,登录小程序制…...
如何使用CSS实现一个水平居中和垂直居中的布局?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 水平居中布局⭐ 垂直居中布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣…...
关于css 的选择器和 css变量
css 选择器 常用的选择器 1. 后代选择器:也就是我们常见的空格选择器,选择的对象为该元素下的所有子元素 。例如,选择所有 元素下的 元素 div p{font-size:14px}2. 子元素选择器 ‘>’ 选择某元素下的直接子元素。例如,选择所…...
大数据技术概述(三)——编程语言的选择
文章目录 1.6编程语言的选择1.6.1java和Scala1.6.2Python1.6.3SQL 1.6编程语言的选择 大数据编程一般会使用Java、Scala和python等编程语言,Flink目前也支持上述3种语言。 1.6.1java和Scala Java支持多线程,其生态圈中可用的第三方库众多。Java虚拟机…...
Flutter对象状态动态监听Watcher
场景:当一个表单需要在表单全部或者特定项赋值后才会让提交按钮可点击。 1.普通实现方式: ///场景:检查[test11][test12][test13]均不为空时做一些事情,例如提交按钮变成可点击String? test11;String? test12;int? test13;///当…...
期权分仓开户资金是否安全?具体保障措施有哪些?
网上关于期权分仓系统的真假一直都没有定论,两方人的争论也让很多没有接触过期权分仓系统的人摸不着头脑,那么期权分仓靠谱吗?资金在里面安全吗?下文为大家科普期权分仓开户资金是否安全?具体保障措施有哪些? 一、期权…...
Unity Mac踩坑日记
1、读取外部文件夹使用IO,读取StreamingAsset或者Unity定义文件夹或者服务器文件使用www或者UnityRequest 2、mac下使用www 需要添加前缀:"file://" 3、Mac下的Rider很好用,断点调试也很方便 4、改变文件编码格式,使…...
什么是负载均衡
前提概述 关于负载均衡,我会从四个方面去说 1. 负载均衡产生的背景 2. 负载均衡的实现技术 3. 负载均衡的作用范围 4. 负载均衡的常用算法 负载均衡的诞生背景 在互联网发展早期,由于用户量较少、业务需求也比较简单。对于软件应用,我们只需要…...
尽管价格走势平淡,但DeFi领域仍然非常有趣
DEX代表加密货币交易的创新,就在去年,这些去中心化、非托管平台的活动与CEX比相形见绌,但自那时以来,DEX已经迎头赶上,并在几个月内超越了中心化服务交易量,让用户能够更好地控制自己的资产和进行新类型的交…...
RCU安全引用计数
原文网址:https://lwn.net/Articles/93617 原文作者:Corbet 原文时间:2004年7月14日 内核提供了一种用于实现引用计数的简单机制kref;该机制是今年3月份完成的。kref机制的核心思想是,提供支持原子操作的计数器&…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
