【剑指offer】找出数组中出现一次的两个数
2013-09-08 10:50:46
一个整型数组中,除了两个数字之外,其他数字都出现了2次,找出这两个只出现一次的数字,要求时间复杂度是O(N),空间复杂度是O(1)。
小结:
- 任何数与0异或,结果仍为本身;
- 两个相同的数字异或,结果为0;
- 利用异或的以上两个特点,进行求解。
代码(测试暂未发现问题,欢迎交流指正!):
1 #include <iostream> 2 #include <cassert> 3 using namespace std; 4 5 typedef int DataType; 6 7 //返回一个数字的二进制表示中最低位的1的位置 8 size_t GetNumberOfOnce(DataType number) 9 { 10 assert(number != 0); 11 12 size_t mask = 1; 13 size_t cnt = 0; 14 15 while ( !(number & mask) ) 16 { 17 ++cnt; 18 number = number>>1; 19 } 20 21 return (cnt); 22 } 23 24 //找出一个数组中仅出现一次的数字,通过pNumber1、pNumber2返回 25 void GetNumberOfOnce(DataType *array,size_t len,DataType *pNumber1,DataType *pNumber2) 26 { 27 assert(array != NULL); 28 assert(len >= 2); 29 30 *pNumber1 = 0; 31 *pNumber2 = 0; 32 size_t index = 0; 33 size_t resXOR = array[0]; 34 35 for (index = 1;index < len;++index) 36 { 37 resXOR ^= array[index]; 38 } 39 40 size_t positionOf1 = GetNumberOfOnce(resXOR); 41 size_t mask = 1 << positionOf1; 42 43 for (index = 0;index < len;++index) 44 { 45 if (array[index] & mask) //任何数与0异或,结果仍为本身 46 { 47 *pNumber1 ^= array[index]; 48 } 49 else 50 { 51 *pNumber2 ^= array[index]; 52 } 53 } 54 } 55 56 //测试GetNumberOfOnce函数 57 void TestGetNumberOfOnce() 58 { 59 DataType array[10] = {1,2,3,2, 3,5,6,7, 6,5}; 60 //DataType array[10] = {1, 6}; 61 size_t len = 10; 62 DataType number1 = 0; 63 DataType number2 = 0; 64 65 GetNumberOfOnce(array,len,&number1,&number2); 66 cout<<"the numbers appear once are : "<<number1<<"\t"<<number2<<endl; 67 } 68 69 int main() 70 { 71 TestGetNumberOfOnce(); 72 return 0; 73 }
测试结果:
the numbers appear once are : 7 1 请按任意键继续. . .
转载于:https://www.cnblogs.com/youngforever/p/3308147.html
【剑指offer】找出数组中出现一次的两个数相关推荐
- java数组出现次数最多的数_找出数组中出现次数最多的那个数——主元素问题...
方法一:以空间换时间,可以定义一个计数数组int count[101],用来对数组中数字出现的次数进行计数(只能针对数组中数字的范围1~100),count数组中最大的元素对应的下标,即为出现次数最多 ...
- 剑指offer系列-03.数组中的重复数字
剑指offer系列第03题.数组中的重复数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字重复了,也不 ...
- 《剑指offer》——03. 数组中重复的数字——HashSet、哈希思想——java实现
文章目录: 1.题目描述 2.解决方案 (1)HashSet方法解决 (2)哈希思想(巧解) 3.参考 1.题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所 ...
- 【剑指offer】_15数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指offer (03):数组中重复的数字 (C++ Python 实现)
1 题目一 找出数组中重复的数字 1.1 描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一 ...
- 剑指offer——3.实现数组中重复数字查找
知识点: 排序一个长度为n的数组需要的时间 变量和属性的区别: 变量是方法体中定义的,我们称为临时变量:属性是类体中定义的. 权限标示符只用于修饰属性和方法.不修饰变量. 方法中定义的临时变量在方法调 ...
- 【剑指offer】登峰造极--数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字
关注我--个人公众号:后端技术漫谈 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边缘计算等方向. 原创博客主要内容 Java知识点复习全手册 Leetcode算法题解析 ...
- 【剑指offer】_12 数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
最新文章
- 国内操作系统OS分析(上)
- 一个强迫症的Git 选择
- Buffer Cache Hit Ratio
- 敏捷个人架构图 V1.3
- python给用户打标签_python用户评论标签匹配的解决方法
- php成行排列,一个php实现的生成排列的算法
- jquery获得指定元素坐标的方法
- dnn模型 list index out of range_通过MalConv模型实现恶意软件的分类
- 外星人电脑为什么那么贵_为什么隐形矫正那么贵
- 神经网络基础模型--Logistic Regression的理论和实践
- 零基础新手应该如何学习平面设计
- 七种经典回归分析法全解析
- linux联网是否,Linux命令 查看Linux版本和是否联网
- php获取qq头像地址,获取 QQ 头像地址,并且不暴露 QQ 号
- 齐齐哈尔大学计算机专业好么,齐齐哈尔大学(专业学位)计算机技术考研难吗
- IDEA报错:不支持发行版本
- ubuntu如何降级到之前的版本
- 软件测试主管应具备的素质,软件测试人员应具备的素质
- 《Distilling the Knowledge in a Neural Network》 论文阅读笔记
- 信息、消息与信号及通信系统的组成
热门文章
- 投资级别(Investment Grade)
- X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件
- ORA-27102: out of memory并伴随OSD-00031的处理
- window.open和window.showModalDialog用法
- 商务智能之绩效管理 Performance Management
- Android WebView 开发详解(二)
- 电子书下载:Illustrated C# 2012 4th
- Mybatis之占位符与拼接符
- 面试:Handler 的工作原理是怎样的?
- leetcode 之Single Number(13)