查找算法之查找一个数组中两两数字相同,只有其中两个数字是不一样的,将其找出
2017-02-08 17:40
585 查看
题目:一个整形数组,其中只有两个数字是不一样的,其他都是两两相同,找出这两个不同的数字
方案一:两个循环foreach每一个数组中的比较是否相等,当然要剔除自身的比较时间复杂度是O(n*n),空间复杂度为O(1)
方案二:用字典,本身的数字作为key,出现次数为value,扫描整个数组,判断当key相同时,作为value的值加1,扫描完数组后,扫描字典找出value等于1对应的key既是要找的数字,时间复杂度为O(n),空间复杂度为O(n)
方案三:用位操作巧妙解决此类问题使得空间和时间复杂度最优
看如下例子 数组 {2, 7, 3, 2, 10, 3} 找出其中不同的两个数即7和10
首先将数组中的每个数逐个异或,得到结果13 [00001101],基于这个异或的结果找出从低位开始的第一位为1的位置,这个例子中是第0位
![](https://oscdn.geek-share.com/Uploads/Images/Content/201702/08/bfedff25f6f13983eb04c4a2b0363776.png)
基于这个第一位为1的位置将整个数组按照此位为0或1分为2个子数组{2,2,10}和{7,3,3},因为如果两个元素相同那么他们的这一位肯定是相同的
再将每个子数组异或得到想要找的两个数,C#代码如下,这里省略了最后将两个子数组异或的代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201702/08/1e214419b932620c0ee00f5dbf860dc8.png)
方案一:两个循环foreach每一个数组中的比较是否相等,当然要剔除自身的比较时间复杂度是O(n*n),空间复杂度为O(1)
方案二:用字典,本身的数字作为key,出现次数为value,扫描整个数组,判断当key相同时,作为value的值加1,扫描完数组后,扫描字典找出value等于1对应的key既是要找的数字,时间复杂度为O(n),空间复杂度为O(n)
方案三:用位操作巧妙解决此类问题使得空间和时间复杂度最优
看如下例子 数组 {2, 7, 3, 2, 10, 3} 找出其中不同的两个数即7和10
首先将数组中的每个数逐个异或,得到结果13 [00001101],基于这个异或的结果找出从低位开始的第一位为1的位置,这个例子中是第0位
![](https://oscdn.geek-share.com/Uploads/Images/Content/201702/08/bfedff25f6f13983eb04c4a2b0363776.png)
基于这个第一位为1的位置将整个数组按照此位为0或1分为2个子数组{2,2,10}和{7,3,3},因为如果两个元素相同那么他们的这一位肯定是相同的
再将每个子数组异或得到想要找的两个数,C#代码如下,这里省略了最后将两个子数组异或的代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201702/08/1e214419b932620c0ee00f5dbf860dc8.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201702/08/8a4e200ca5b29f20d46e3b980ac4dbaa.png)
相关文章推荐
- spark 提交任务的时候指定名字
- shiro 单点登录原理 实例
- Windows系统ADO访问access数据库,报无效指针错误
- VC中当鼠标停靠在按钮等控件上时出现文字提示功能
- CSS 选择器
- 关于Node.js后端架构的一点后知后觉
- 效果动画
- pat-basic-1028-c语言
- Hibernate 一对一外键单向关联
- 用JMX监测JVM的运行参数
- Tr A
- 哈夫曼编码问题
- linux shell脚本
- git打标签
- JVM:如何分析线程堆栈
- struts默认配置文件
- 使用git add添加完文件,想要撤销
- Android 热修复,没你想的那么难
- Android面试宝典 --第三章组件
- python3 json数据包含中文的读写问题