【剑指offer】找出数组中出现一次的两个数
2013-09-08 10:50:46
一个整型数组中,除了两个数字之外,其他数字都出现了2次,找出这两个只出现一次的数字,要求时间复杂度是O(N),空间复杂度是O(1)。
小结:
- 任何数与0异或,结果仍为本身;
- 两个相同的数字异或,结果为0;
- 利用异或的以上两个特点,进行求解。
代码(测试暂未发现问题,欢迎交流指正!):
- #include <iostream>
- #include <cassert>
- using namespace std;
- typedef int DataType;
- //返回一个数字的二进制表示中最低位的1的位置
- size_t GetNumberOfOnce(DataType number)
- {
- assert(number != );
- size_t mask = ;
- size_t cnt = ;
- while ( !(number & mask) )
- {
- ++cnt;
- number = number>>;
- }
- return (cnt);
- }
- //找出一个数组中仅出现一次的数字,通过pNumber1、pNumber2返回
- void GetNumberOfOnce(DataType *array,size_t len,DataType *pNumber1,DataType *pNumber2)
- {
- assert(array != NULL);
- assert(len >= );
- *pNumber1 = ;
- *pNumber2 = ;
- size_t index = ;
- size_t resXOR = array[];
- for (index = ;index < len;++index)
- {
- resXOR ^= array[index];
- }
- size_t positionOf1 = GetNumberOfOnce(resXOR);
- size_t mask = << positionOf1;
- for (index = ;index < len;++index)
- {
- if (array[index] & mask) //任何数与0异或,结果仍为本身
- {
- *pNumber1 ^= array[index];
- }
- else
- {
- *pNumber2 ^= array[index];
- }
- }
- }
- //测试GetNumberOfOnce函数
- void TestGetNumberOfOnce()
- {
- DataType array[] = {,,,, ,,,, ,};
- //DataType array[10] = {1, 6};
- size_t len = ;
- DataType number1 = ;
- DataType number2 = ;
- GetNumberOfOnce(array,len,&number1,&number2);
- cout<<"the numbers appear once are : "<<number1<<"\t"<<number2<<endl;
- }
- int main()
- {
- TestGetNumberOfOnce();
- return ;
- }
测试结果:
- the numbers appear once are :
- 请按任意键继续. . .
【剑指offer】找出数组中出现一次的两个数的更多相关文章
- 剑指offer.找出数组中重复的数字
题目: 给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...
- 剑指Offer 找出字符串中第一个只出现一次的字符
题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
- 《剑指offer》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...
- 【剑指Offer】旋转数组中的最小数字 解题报告(Python)
[剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或
剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...
- 【剑指offer】03.数组中重复的数组
剑指 Offer 03. 数组中重复的数字 知识点:数组:哈希表:萝卜占坑思想 题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些 ...
- 《剑指offer》-找到数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- [剑指Offer]53-在排序数组中查找数字(二分查找)
题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这 ...
随机推荐
- nodejs remote链接mysql数据库总结
nodejs链接远端mysql,这个折腾了一个上午才搞定.本以为,直接使用就OK了,但是发现不行,后来查阅各种资料后,终于找到了方法. nodejs链接远端数据库主要分为几个步骤: 1)安装node- ...
- L011-oldboy-mysql-dba-lesson11
L011-oldboy-mysql-dba-lesson11 [root@ab01 ~]# mysqladmin -i 1 -r status #mysqladmin监控的命令 Uptime: ...
- 在ThinkPHP3.x框架中实现将原创文章第一时间推送到百度收录
前两天自己写的一篇文章“针对BootStrap中tabs控件的美化和完善”被别的网站给转载了,这也许是值得高兴的一件事情,但是有些网站并没有注明来源和作者.而去百度搜索这篇文章,排名第一的居然是那些转 ...
- HTML 中的字符集、ASCII、 ISO-8859-1、符号之间的关系和 HTML URL 编码注意的事项
一.HTML 实体 1.什么是HTML 实体? 在 HTMl 中,某些字符是保留的.小于号 (<) 和 大于号 (>), 浏览器会误认为是标签 如果希望正确地显示预留字符,必须在 HTML ...
- mysql实例 保存查询结果到变量
本文介绍下,一个mysql的例子,将查询到的数据结果保存到一个变量中.有需要的朋友可以参考下. 本代码演示: 将mysql查询结果保存到变量中的方法. 代码: view source print? 0 ...
- 增加p()函数,方便开发中对变量打印调试
在开发的过程中,我们经常要输出一下变量看看得到的结果是什么,我们就要根据变量的类型选择使用echo,print_r或者var_dump,brophp框架中的p()函数会自动根据变量类型选择用什么方法为 ...
- Pox启动及事件产生、监听分析
./pox/pox.py , Pox 实例化core=pox.core.initialize(),即为实例化POXCore类(该类是所有组件的交接点,提供组件注册功能),监听cor ...
- Homebrew下安装Cocoapods
在Mavericks下安装Cocoapods遇到ruby安装问题,参照以下网址圆满解决问题. http://www.moncefbelyamani.com/how-to-install-xcode-h ...
- fragment第二次载入就报错
1.布局中加入一个<fragment 标签,第一次载入的时候是正常的,第二次加载的时候,就直接crashed,退出 2.查到原因Caused by: java.lang.IllegalArgum ...
- Invalid argument supplied for foreach()
将需要被遍历的数组强制转换为数组类型即可 <?php $array = null; foreach((array)$array as $value){ #..code.... } ?>