| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【经典算法题】在数组中找两个单身狗 -> 正文阅读 |
|
[数据结构与算法]【经典算法题】在数组中找两个单身狗 |
?前言?:算法是一个程序员的内功,能很好的体现程序员的编程思维,通过学习和掌握常见的算法,不仅能提高coding能力,还能更加容易在笔面试中脱颖而出。本专栏将记录博主刷算法题的过程,不定期的会更新一些优质的算法题。如果对大家有帮助,别忘了三连支持哟! 目录 ?题目描述?
?题目分析?:在解决这道题目之前我们首先来了解一下按位异或运算符的一些操作 按位异或运算符
🔑:现在我们了解了按位异或操作符,在解决这个问题前,我们先解决它的简化版本:一个数组中只有一个元素出现了一次,其它元素均出现了两次 💎一个单身狗💎🔑这题的难点就在于我们是否能正确的理解按位异或运算的操作符,其实按位运算有一个功能: 如果我们把数组中的所有元素按位异或起来,利用交换律和结合律把所有相同的聚在一起,这时如果出现偶数次的元素就会消除掉,出现偶数次的就会保留下来,因此我们遍历一遍数组,将所有元素按位异或起来,得到的结果就是那个只出现一次的数字。
💎两个单身狗💎🔑:在解决完一个单身狗后我们知道,我们可以遍历一遍数组,将数组中的所有元素按位异或起来,这样就可以消除出现偶数次的元素。但是有一个问题: 因为数组中有两个元素出现一次,所以遍历一遍后eor=num1^num2;其中num1和num2是那个只出现一次的数字。 ?1:由于数组中有两个单身狗,所以num1!=num2,这就保证了eor!=0,所以在eor的二进制序列中一定会有一个1. 2:因为eor是由num1^num2的结果,所以在eor二进制中从右往左数第一个1处,num1和num2 在这一比特位上一定存在不同,那么我们利用分治法,将数组中这一比特位上是1的元素分成一组,将数组中这一比特位是0的元素分成一组,我们可以保证在每一组中都有唯一一个单身狗,这样把每一组按位异或起来,就能得到这两个单身狗。
eor&(~eor+1)公式拿到二进制序列最右端的一个1图解:
?具体代码详解?:
以上代码,还可做优化在此仅作参考,若有更好的算法,还望能够私信告知,多谢各位。 由于本人水平十分有限,若有错误请即使告知!如果有帮助别忘了,万分感谢。 点赞👍? ? ? ? ?收藏?? ? 关注? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:31:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |